🔍 Controller

@PostMapping("/user/cart/{id}")
public ResponseEntity<List<ResponseCart>> createCart(HttpServletRequest request, @PathVariable Long id, @RequestBody RequestSize requestSize) {
    List<ResponseCart> cartList = cartService.createCart((User) request.getAttribute("user"), id, requestSize.getSize());
    return (cartList != null) ?
            ResponseEntity.status(HttpStatus.OK).body(cartList) :
            ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null);
}

CartServicecreateCart함수를 호출하고 결과에 따라 200 또는 400의 status code를 반환

🔍 Service

@Override
public List<ResponseCart> createCart(User user, Long product_id, String size) {
    Product product = productRepository.findById(product_id).orElse(null);

    if(user == null || product == null) {
        return null;
    }

    Boolean check_same = cartRepository.findSameCart(user.getId(), product_id, size,ADD);
    if(!check_same) {
        Cart cart = Cart.builder()
                .id(null)
                .count(1)
                .user(user)
                .product(product)
                .size(size)
                .build();
        cartRepository.save(cart);
    }

    return readCart(user);
}

ProductRepository 를 이용해 product_id 에 대한 엔티티를 받아옴

CartRepositoryfindSameCart 를 이용해 내 장바구니에 같은 상품이 있는지 여부를 알아옴 → 있다면 check_same 이 true 없다면 false

장바구니에 같은 상품이 없을 땐 cart Entity를 만들어 저장

장바구니에 같은 상품이 있을 땐 Repository 안에 로직 수행

그 후 클라이언트에게 보낼 장바구니 내역을 링크와 같이 수행

🔍 Repository

@Override
@Transactional
public Boolean findSameCart(Long user_id, Long product_id, String size, int state) {
    SelectCart selectCart = selectFromUserID_N_ProductID(user_id, product_id, size);

    if(selectCart == null) {
        return false;
    }

    int state_value = 1;

    if(state == CartServiceImpl.DELETE){
        state_value = -1;
        if(selectCart.getCount() == 1) {
            deleteCartID(selectCart.getId());
            return true;
        }
    }

    updateCartID(selectCart.getId(), selectCart.getCount() + state_value);
    return true;
}

@Override
public SelectCart selectFromUserID_N_ProductID(Long user_id, Long product_id, String size){
    BooleanExpression status_user = eqUserID(user_id);
    BooleanExpression status_product = eqProductID(product_id);
    BooleanExpression status_size = eqSize(size);

    if (status_user == null || status_product == null || status_size == null) {
        return null;
    }

    return queryFactory.select(Projections.fields(SelectCart.class,
                    cart.id,
                    cart.count,
                    Expressions.asString(size).as("size"),
                    Expressions.asNumber(user_id).as("user_id"),
                    Expressions.asNumber(product_id).as("product_id")))
            .from(cart)
            .where(status_user, status_product, status_size)
            .fetchOne();
}

selectFromUserID_N_ProductID 를 통해 입력 값 오류 여부와 SelectCart 타입으로 정보를 조회

입력 값의 조건에 일치하는 SelectCart 의 정보가 없다면 false 반환

있다면 ADDDELETE를 구분하여 재고 수정

ADD 라면 원래 있던 재고에 +1을 하는 형태

DELETE 라면 원래 있던 재고가 1개인지 파악 후 1개 라면 해당 열을 삭제

1개가 아니라면 state_value 를 -1로 바꿔 재고 + (-1) 을 하는 형태