🔍 Controller

@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의 정보를 파악 후 CartServicereadCart 함수를 호출하여 결과에 따라 200 또는 400의 status code를 반환

🔍 Service

@Override
public List<ResponseCart> readCart(User user) {
    return cartRepository.findAllCart(user.getUsername());
}

CartRepositoryfindAllCart 를 호출

QueryDSL의 DTO로 조회를 이용해 Service단에서의 EntityDTO 로직 없이 바로 결과반환

🔍 Repository

@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 로 관계가 명시된 프록시 UserProduct를 Join없이 불러온다면 묵시적 조인이 발생 → inner join으로 조인을 명시하여 cross join 회피