해당 포스팅에서는 장바구니 추가 기능의 흐름에 대해서 정리해 보고자 한다.
- Controller: 장바구니 추가 요청을 처리한다.
- CartService: 장바구니와 관련된 비즈니스 로직을 처리한다.
@PostMapping("/cart")
public ResponseEntity<Object> cart(@RequestBody @Valid CartItemDto cartItemDto, BindingResult bindingResult,
@CurrentAccount Account account) {
if (bindingResult.hasErrors()) {
StringBuilder sb = new StringBuilder();
List<FieldError> fieldErrors = bindingResult.getFieldErrors();
for (FieldError fieldError : fieldErrors) {
sb.append(fieldError.getDefaultMessage());
}
return ResponseEntity.badRequest().body(sb.toString());
}
Long cartItemId;
try {
cartItemId = cartService.addCart(cartItemDto, account.getUserIdentifier());
} catch (Exception e) {
return ResponseEntity.badRequest().body(e.getMessage());
}
return ResponseEntity.ok().body(cartItemId);
}
public Long addCart(CartItemDto cartItemDto, String userIdentifier) {
Item item = itemRepository.findById(cartItemDto.getItemId()).orElseThrow(EntityNotFoundException::new);
Account account = accountRepository.findByUserIdentifier(userIdentifier);
Cart cart = cartRepository.findByAccountId(account.getId());
if (cart == null) {
cart = Cart.createCart(account);
cartRepository.save(cart);
}
CartItem savedCartItem = cartItemRepository.findByCartIdAndItemId(cart.getId(), item.getId());
if (savedCartItem != null) {
savedCartItem.addCount(cartItemDto.getCount());
return savedCartItem.getId();
} else {
CartItem cartItem = CartItem.createCartItem(cart, item, cartItemDto.getCount());
cartItemRepository.save(cartItem);
return cartItem.getId();
}
}