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;
}
}
기술 설명
Product·User 객체 생성
itemRequestDTO.getProdNo()로Product엔티티(prodNo필드만 셋팅)userDetails.getUsername()로User엔티티(uid필드만 셋팅)- 실제로는 최소 정보만 있어 JPA 조회 없이 관계 매핑 용도.
옵션 파라미터 준비
options = itemRequestDTO.getOptions()에서 맵을 받아"opt1" ~ "opt6","opt1cont" ~ "opt6cont"키로 존재 여부를 확인하여 배열optParams[],optContParams[]에 저장기존 장바구니 조회
cartRepository.findByUserAndProductAndOptions(...)호출user.getUid(),product.getProdNo(),optParams[i],optContParams[i]순서로 넘겨- 같은 사용자·상품 번호·옵션 조합이 이미 존재하는지
Optional<Cart>반환이미 존재하면 수량 증가
Cart cart = optCart.get(); cart.setCartProdCount(cart.getCartProdCount() + itemRequestDTO.getQuantity()); cartRepository.save(cart);
- 조회된
Cart엔티티를 꺼내 현재 수량에itemRequestDTO.getQuantity()더한 뒤 저장존재하지 않으면 신규 엔티티 생성·저장
Cart cart = toCartEntity(itemRequestDTO, product, user); cartRepository.save(cart);
toCartEntity(...)호출해ItemRequestDTO·Product·User기반으로Cart엔티티 생성- 이후
cartRepository.save(cart)로 DB에 삽입예외 처리 및 반환값
- 저장 과정에서 예외 발생 시
catch블록으로 넘어가0반환- 정상 처리 시
1반환 (1= “성공적으로 담기 혹은 수량 증가”)
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();
}
기술 설명
- toCartEntity(ItemRequestDTO, Product, User):
- 인자로 받은
ItemRequestDTO,Product,User를 기반으로Cart엔티티를 빌더 패턴으로 생성cartProdCount필드에dto.getQuantity()(주문 수량) 할당- 옵션 1~6(
opt1~opt6)과 옵션 상세(opt1cont~opt6cont)는dto.getOptions()맵에서 꺼내오고
- 값이 없으면 공백 문자열
""로 대체 (getOrDefault)- 반환된
Cart객체는 바로cartRepository.save(...)로 저장 가능
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;
}
기술 설명
- findAllByUid(UserDetails):
User.builder().uid(userDetails.getUsername()).build()로 최소 정보의User엔티티 생성cartRepository.findAllByUser(user)호출
- 해당 사용자(
uid)의 모든Cart엔티티 리스트 조회.stream().map(...)으로List<Cart>→List<CartDTO>로 변환
modelMapper.map(item, CartDTO.class)로 엔티티 필드 일대일 복사dto.setUid(userDetails.getUsername())로 DTO에uid설정- 최종
List<CartDTO>반환하여 컨트롤러에서 View로 전달
@Transactional
public int deleteByCartNo(int cartNo) {
try {
cartRepository.deleteByCartNo(cartNo);
return 1;
} catch (Exception e) {
log.error("Cart 삭제 중 예외 발생. cartNo: {}", cartNo, e);
return 0;
}
}
기술 설명
- deleteByCartNo(int):
@Transactional어노테이션으로 해당 메서드 내 삭제가 실패하면 롤백 처리cartRepository.deleteByCartNo(cartNo)호출하여
- 주어진
cartNo에 해당하는 레코드를 DB에서 삭제- 삭제 성공 시
1반환, 실패(예외 발생) 시
log.error(...)로 에러 상세 로깅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("장바구니 항목을 찾을 수 없습니다.");
}
}
기술 설명
- updateCartProdCount(Integer, int):
cartRepository.findById(cartNo)로 해당Cart엔티티 조회
Optional<Cart>결과if (cartOptional.isPresent()) { ... } else { ... }
- 존재하면:
cart.setCartProdCount(newQuantity)로 새 수량 설정cartRepository.save(cart)로 DB에 변경된 수량 저장- 존재하지 않으면:
RuntimeException("장바구니 항목을 찾을 수 없습니다.")던져 예외 처리