@Getter
@Setter
public class CartQueryDto {
private Long cartItemId;
private String itemName; //상품명
private int count; //수량
private int price; //상품 가격
public CartQueryDto(Long cartItemId, String itemName, int count, int price) {
this.cartItemId = cartItemId;
this.itemName = itemName;
this.count = count;
this.price = price;
}
}
@Repository
@RequiredArgsConstructor
public class CartQueryRepository {
private final EntityManager em;
public List<CartQueryDto> findCartQueryDtos(Long cartId) {
List<CartQueryDto> cartQueryDtoList = em.createQuery(
"select new com.toyproject.ecommerce.repository.query.CartQueryDto(ci.id, i.name, ci.count, i.price, im.storeName)" +
" from CartItem ci" +
" join ci.item i" +
" join i.itemImageList im" +
" where ci.cart.id = :cartId and" +
" im.firstImage='Y'", CartQueryDto.class)
.setParameter("cartId", cartId)
.getResultList();
return cartQueryDtoList;
}
}
CartQueryRepository를 따로 만든 이유
- CartItemRepository에 쿼리를 작성하지 않고 CartQueryRepository를 따로 만들고 쿼리를 작성하였습니다.
- CartItemRepository는 cartItem 엔티티를 조회하는 용도(핵심 비지니스)로만 사용하고 엔티티가 아닌 특정 화면을 조회하는 쿼리(장바구니 조회하는 쿼리 등), API 쿼리는 CartQueryRepository로 따로 작성하였습니다.
- 관심사의 분리 -> 단일 책임 원칙(SRP, Single Reponsibility Principle)
@Transactional(readOnly = true)
public List<CartQueryDto> findCartItems(Long memberId) {
Cart cart = cartRepository.findByMemberId(memberId).orElseThrow(EntityNotFoundException::new); // () -> new EntityNotFoundException()
List<CartQueryDto> cartQueryDtos = cartQueryRepository.findCartQueryDtos(cart.getId());
return cartQueryDtos;
}
@GetMapping("/cart")
public String cartView(Model model, HttpServletRequest request) {
Member member = getMember(request);
List<CartQueryDto> cartItemListForm = cartService.findCartItems(member.getId());
model.addAttribute("cartItemListForm", cartItemListForm);
return "cart/cartView";
}
private Member getMember(HttpServletRequest request) {
HttpSession session = request.getSession(false);
//비로그인 사용자
if (session == null || session.getAttribute(SessionConst.LOGIN_MEMBER) == null) {
return null;
}
//세션에 저장되어있는 회원정보 가져오기
Member member = (Member) session.getAttribute(SessionConst.LOGIN_MEMBER);
return member;
}
체크박스 값 변화 감지 https://www.codingfactory.net/13044
https://carina16.tistory.com/143