@GetMapping("/user/cart")
public ResponseEntity<List<ResponseCart>> readCart(HttpServletRequest request) {
List<ResponseCart> cartList = cartService.readCart((User) request.getAttribute("user"));
return (cartList != null) ?
ResponseEntity.status(HttpStatus.OK).body(cartList) :
ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null);
}
Request에 있는 JWT를 통해 User의 정보를 파악 후 CartService 의 readCart 함수를 호출하여 결과에 따라 200 또는 400의 status code를 반환
@Override
public List<ResponseCart> readCart(User user) {
return cartRepository.findAllCart(user.getUsername());
}
CartRepository 의 findAllCart 를 호출
QueryDSL의 DTO로 조회를 이용해 Service단에서의 Entity → DTO 로직 없이 바로 결과반환
@Override
public List<ResponseCart> findAllCart(String username) {
BooleanExpression status_user = eqUsername(username);
if (status_user == null) {
return null;
}
return queryFactory.select(Projections.fields(ResponseCart.class,
product.id,
product.name,
product.price,
cart.size,
product.imgKey,
cart.count,
new CaseBuilder()
.when(product.stock.gt(0))
.then(true)
.otherwise(false).as("stock_zero")
))
.from(cart)
.innerJoin(cart.product,product)
.innerJoin(cart.user,user)
.where(status_user)
.fetch();
}
CaseBuilder를 통해 상품의 재고가 0을 기준으로 true와 false을 나눔
Cart 테이블과 LAZY 로 관계가 명시된 프록시 User와 Product를 Join없이 불러온다면 묵시적 조인이 발생 → inner join으로 조인을 명시하여 cross join 회피