코드 그라데이션
shop 구현 (16) 장바구니 담기, 장바구니에 내역 조회 본문
장바구니 담는 로직
public Long addCart(CartItemDto cartItemDto, String email){
Item item = itemRepository.findById(cartItemDto.getItemId())
.orElseThrow(EntityExistsException::new); // 상품 추출
Member member = memberRepository.findByEmail(email); // 로그인된 사용자 추출
Cart cart = cartRepository.findByMemberId(member.getId()); // 카트 추출
if(cart == null){ // 카트가 Null이면 -> 신규가입자
cart = Cart.createCart(member); // 카트생성
cartRepository.save(cart);
}
카트가 없는 신규가입자이면 카트부터 만들어준다.
앞선 Item 부분에서 비교했듯이
Cart cart = cartRepository.findByMemberId(member.getId()) 이것도 Cart 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();
}
바로 여기로 와서 작업을 시작한다.
조회 로직
@Transactional(readOnly = true)
public List<CartDetailDto> getCartList(String email){
List<CartDetailDto> cartDetailDtoList = new ArrayList<>();
Member member = memberRepository.findByEmail(email);
Cart cart = cartRepository.findByMemberId(member.getId());
if(cart == null){ // Null 비어있는 리스트 전달
return cartDetailDtoList;
}
cartDetailDtoList = cartItemRepository.findCartDetailDtoList(cart.getId());
return cartDetailDtoList;
}
이때는 null이어도 자연스러운 상황(null이 에러가 아니다. 장바구니는 당연히 비어있을 수도 있으니까.)
이거 좀 더 리펙토링을 해보면사용되는 부분이랑 만들어지는 부분이랑 최대한 가까운 게 좋다.
@Transactional(readOnly = true)
public List<CartDetailDto> getCartList(String email){
Member member = memberRepository.findByEmail(email);
Cart cart = cartRepository.findByMemberId(member.getId());
List<CartDetailDto> cartDetailDtoList = new ArrayList<>();
if(cart == null){ // Null 비어있는 리스트 전달
return cartDetailDtoList;
}
cartDetailDtoList = cartItemRepository.findCartDetailDtoList(cart.getId());
return cartDetailDtoList;
}
58:14
어떻게 Repository 코드에
@Query("select new com.shop.dto.CartDetailDto(ci.id, i.itemNm, i.price, ci.count, im.imgUrl) " +
"from CartItem ci, ItemImg im "+
"join ci.item i " +
"where ci.cart.id = :cartId " +
"and im.item.id = ci.item.id " +
"and im.repImgYn = 'Y' " +
"order by ci.regTime desc")
List<CartDetailDto> findCartDetailDtoList(Long cartId);
이렇게 쓰는 이유가 무엇인가?
"의도적으로 이름을 보고 만드는 코드"
이게 한계가 있기 때문에 인위적인 쿼리문을 만들어서 준다(이름만 보고 유추하게 만드는 코드는 한계가 있다.
쿼리문이 있으면 findCartDetailDtoList 이걸 보고 만드는 게 아니라
("select new com.shop.dto.CartDetailDto(ci.id, i.itemNm, i.price, ci.count, im.imgUrl) " +
"from CartItem ci, ItemImg im "+
"join ci.item i " +
"where ci.cart.id = :cartId " +
"and im.item.id = ci.item.id " +
"and im.repImgYn = 'Y' " +
"order by ci.regTime desc")
이걸 보고 직접 쿼리문을 만든다.
'Spring > SpringShop' 카테고리의 다른 글
shop 구현 (18) 상품 삭제하기 (0) | 2023.07.25 |
---|---|
shop 구현 (17) 장바구니에서 상품 주문하기 (0) | 2023.07.24 |
shop 구현 (15) 주문 취소하기 (0) | 2023.07.22 |
shop 구현 (14) 주문 이력 조회 (0) | 2023.07.22 |
shop 구현 (13) 주문 기능 구현 (0) | 2023.07.21 |