상품 페이지에서 상품의 수량을 클릭하고 '장바구니 담기'를 클릭하면 상품 id와 수량을 Controller에 전달하게 됩니다. 이를 받을 Dto 객체를 만들겠습니다.
pulibc class CartItemDto{
@NotNull(message = "상품 아이디는 필수 입력 값입니다.")
private Long ItemId;
@Min(value = 1, message = "최소 1개 이상 담아주세요")
private int count;
}
cart와 item, count를 받는 정적 생성자로를 만들어줍니다. 개인당 Cart는 하나씩이며, Cart안에 동일한 아이템이 있다면 기존 아이템에 수량을 증가시켜야 하니 수량 증가 메서드도 추가해줍니다.
public class CartItem extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "cart_item_id")
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "cart_id")
private Cart cart;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "item_id")
private Item item;
private int count;
@Builder
public CartItem(Cart cart, Item item, int count) {
this.cart = cart;
this.item = item;
this.count = count;
}
public static CartItem createCartItem(Cart cart, Item item, int count){
CartItem cartItem = CartItem.builder()
.item(item)
.count(count)
.cart(cart)
.build();
return cartItem;
}
public void addCount(int count){
this.count += count;
}
public void updateCount(int count){
this.count = count;
}
}
사용자가 소유한 장바구니를 member_id를 사용해서 조회할 수 있도록 Repository에 추가해줍니다.
public interface CartRepository extends JpaRepository<Cart, Long> {
Cart findByMemberId(Long memberId);
}
Cart의 Id와 Item의 Id를 사용해서 조회하는 메서드를 추가해줍니다.
public interface CartItemRepository extends JpaRepository<CartItem, Long> {
CartItem findByCartIdAndItemId(Long cartId, Long itemId);
}
전달받은 Dto와 email을 통해서 member와 item을 가져옵니다.
신규 사용자의 경우 Cart가 생성되지 않을 수 있기 때문에 먼저 member를 통해 조회하고 유효성 검증을 진행합니다. 만약 Cart가 없으면 새로 만들어서 저장합니다.
기존에 같은 Cart에 Item이 존재할 수 있기 때문에 Repository에 cart_id, item_id를 사용하여 조회합니다.
만약 값이 존재한다면 CartItem의 메서드를 사용해서 count를 증가시키 없다면 새로 생성해줍니다.
public Long addCart(CartItemDto cartItemDto, String email){
Member member = memberRepository.findByEmail(email);
Item item = itemRepository.findById(cartItemDto.getItemId()).orElseThrow(EntityNotFoundException::new);
Cart cart = cartRepository.findByMemberId(member.getId());
if(cart == null){
cart = Cart.createCart(member);
cartRepository.save(cart);
}
CartItem saveCartItem = cartItemRepository.findByCartIdAndItemId(cart.getId(), item.getId());
if(saveCartItem != null){
saveCartItem.addCount(cartItemDto.getCount());
return saveCartItem.getId();
}else{
CartItem cartItem = CartItem.createCartItem(cart, item, cartItemDto.getCount());
cartItemRepository.save(cartItem);
return cartItem.getId();
}
}
@PostMapping("/cart")
public @ResponseBody ResponseEntity order(@RequestBody @Valid CartItemDto cartItemDto, BindingResult bindingResult, Principal principal){
if(bindingResult.hasErrors()){
StringBuilder sb = new StringBuilder();
List<FieldError> fieldErrors = bindingResult.getFieldErrors();
for(FieldError fieldError : fieldErrors){
sb.append(fieldError.getDefaultMessage());
}
return new ResponseEntity<String>(sb.toString(), HttpStatus.BAD_REQUEST);
}
String email = principal.getName();
Long cartItemId;
try{
cartItemId = cartService.addCart(cartItemDto, email);
}catch (Exception e){
return new ResponseEntity<String>(e.getMessage(), HttpStatus.BAD_REQUEST);
}
return new ResponseEntity<Long>(cartItemId, HttpStatus.OK);
}