장바구니 담기

심규환·2022년 2월 11일
0

Shop

목록 보기
7/10

상품 페이지에서 상품의 수량을 클릭하고 '장바구니 담기'를 클릭하면 상품 id와 수량을 Controller에 전달하게 됩니다. 이를 받을 Dto 객체를 만들겠습니다.

DTO

CartItemDto.Java

pulibc class CartItemDto{

	@NotNull(message = "상품 아이디는 필수 입력 값입니다.")
	private Long ItemId;
    
    @Min(value = 1, message = "최소 1개 이상 담아주세요")
    private int count;
}

Entity

CartItem.Java

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;
    }
}

Repository

CartRepository.Java

사용자가 소유한 장바구니를 member_id를 사용해서 조회할 수 있도록 Repository에 추가해줍니다.

public interface CartRepository extends JpaRepository<Cart, Long> {

    Cart findByMemberId(Long memberId);
}

CartItemRepository.Java

Cart의 Id와 Item의 Id를 사용해서 조회하는 메서드를 추가해줍니다.

public interface CartItemRepository extends JpaRepository<CartItem, Long> {
    CartItem findByCartIdAndItemId(Long cartId, Long itemId);
}

Service

CartService.Java

전달받은 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();
     }
}

Controller

CartController.Java

@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);
}
profile
장생농씬가?

0개의 댓글