장바구니 상품 담기 기능

public int addToCart(ItemRequestDTO itemRequestDTO, UserDetails userDetails) {
    // 상품과 사용자 객체 생성 (ID만 셋팅)
    Product product = Product.builder()
            .prodNo(itemRequestDTO.getProdNo())
            .build();

    User user = User.builder()
            .uid(userDetails.getUsername())
            .build();

    Map<String, String> options = itemRequestDTO.getOptions();

    String[] optParams = new String[6];
    String[] optContParams = new String[6];

    // 옵션 1~6에 대해 존재하는 값만 가져오기
    for (int i = 0; i < 6; i++) {
        optParams[i] = options.getOrDefault("opt" + (i + 1), "");
        optContParams[i] = options.getOrDefault("opt" + (i + 1) + "cont", "");
    }

    // 장바구니에 동일 상품·옵션이 이미 있는지 조회
    Optional<Cart> optCart = cartRepository.findByUserAndProductAndOptions(
            user.getUid(),
            product.getProdNo(),
            optParams[0], optContParams[0],
            optParams[1], optContParams[1],
            optParams[2], optContParams[2],
            optParams[3], optContParams[3],
            optParams[4], optContParams[4],
            optParams[5], optContParams[5]
    );

    try {
        if (optCart.isPresent()) {
            // 이미 있으면 수량만 증가
            Cart cart = optCart.get();
            cart.setCartProdCount(cart.getCartProdCount() + itemRequestDTO.getQuantity());
            cartRepository.save(cart);
        } else {
            // 없으면 신규 Cart 엔티티 생성 후 저장
            Cart cart = toCartEntity(itemRequestDTO, product, user);
            cartRepository.save(cart);
        }
        return 1;
    } catch (Exception e) {
        return 0;
    }
}

기술 설명

DTO → Cart 엔티티 변환 기능

private Cart toCartEntity(ItemRequestDTO dto, Product product, User user) {
    Map<String, String> options = dto.getOptions();

    return Cart.builder()
            .user(user)
            .product(product)
            .cartProdCount(dto.getQuantity())
            .opt1(options.getOrDefault("opt1", ""))
            .opt1Cont(options.getOrDefault("opt1cont", ""))
            .opt2(options.getOrDefault("opt2", ""))
            .opt2Cont(options.getOrDefault("opt2cont", ""))
            .opt3(options.getOrDefault("opt3", ""))
            .opt3Cont(options.getOrDefault("opt3cont", ""))
            .opt4(options.getOrDefault("opt4", ""))
            .opt4Cont(options.getOrDefault("opt4cont", ""))
            .opt5(options.getOrDefault("opt5", ""))
            .opt5Cont(options.getOrDefault("opt5cont", ""))
            .opt6(options.getOrDefault("opt6", ""))
            .opt6Cont(options.getOrDefault("opt6cont", ""))
            .build();
}

기술 설명

장바구니 목록 조회 기능

public List<CartDTO> findAllByUid(UserDetails userDetails) {

    User user = User.builder()
            .uid(userDetails.getUsername())
            .build();

    List<Cart> items = cartRepository.findAllByUser(user);

    List<CartDTO> cartDTOList = items.stream()
            .map(item -> {
                CartDTO dto = modelMapper.map(item, CartDTO.class);
                dto.setUid(userDetails.getUsername());
                return dto;
            })
            .collect(Collectors.toList());

    return cartDTOList;
}

기술 설명

장바구니 상품 삭제 기능

@Transactional
public int deleteByCartNo(int cartNo) {
    try {
        cartRepository.deleteByCartNo(cartNo);
        return 1;
    } catch (Exception e) {
        log.error("Cart 삭제 중 예외 발생. cartNo: {}", cartNo, e);
        return 0;
    }
}

기술 설명


장바구니 수량 업데이트 기능

public void updateCartProdCount(Integer cartNo, int newQuantity) {
    Optional<Cart> cartOptional = cartRepository.findById(cartNo);
    if (cartOptional.isPresent()) {
        Cart cart = cartOptional.get();
        cart.setCartProdCount(newQuantity);
        cartRepository.save(cart);
    } else {
        throw new RuntimeException("장바구니 항목을 찾을 수 없습니다.");
    }
}

기술 설명