코드 그라데이션

shop 구현 (16) 장바구니 담기, 장바구니에 내역 조회 본문

Spring/SpringShop

shop 구현 (16) 장바구니 담기, 장바구니에 내역 조회

완벽한 장면 2023. 7. 24. 00:39

장바구니 담는 로직

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")

이걸 보고 직접 쿼리문을 만든다.

 

 

728x90
Comments