목록BE (354)
오봉이와 함께하는 개발 블로그
주문 조회 V5: JPA에서 DTO 직접 조회 - 컬렉션 조회 최적화 OrderApiController에 추가 @GetMapping("/api/v5/orders") public List ordersV5() { return orderQueryRepository.findAllByDto_optimization(); } OrderQueryRepository에 추가 /** * 최적화 * Query: 루트 1번, 컬렉션 1번 * 데이터를 한꺼번에 처리할 때 많이 사용하는 방식 */ public List findAllByDto_optimization() { //루트 조회(toOne 코드를 모두 한번에 조회) List result = findOrders(); //orderItem 컬렉션을 MAP을 통해 한번에 조회(루..
주문 조회 V4: JPA에서 DTO 직접 조회 OrderApiController에 추가 @GetMapping("/api/v4/orders") public List ordersV4() { return orderQueryRepository.findOrderQueryDtos(); } OrderQueryRepository package jpabook.jpashop.repository.order.query; @Repository @RequiredArgsConstructor public class OrderQueryRepository { private final EntityManager em; /** * 컬렉션은 별도로 조회 * Query: 루트 1번, 컬렉션 N 번 * 단건 조회에서 많이 사용하는 방식 */ pu..
주문 조회 V3.1: 엔티티를 DTO로 변환 - 페이징과 한계 돌파 컬렉션을 페치 조인하면 페이징이 불가능하다. 컬렉션을 페치 조인하면 일대다 조인이 발생하므로 데이터가 예측할 수 없이 증가한다. 일대다에서 일(1)을 기준으로 페이징을 하는 것이 목적인데, 데이터는 다(N)를 기준으로 row가 생성된다. Order를 기준으로 페이징을 하고 싶은데, 다(N)인 OrderItem을 조인하면 OrderItem이 기준이 된다. 이 경우 하이버네이트는 경고 로그를 남기고 모든 DB 데이터를 읽어서 메모리에서 페이징을 시도한다. 이는 최악의 경우 장애로 이어질 수 있다. 한계 돌파 그러면 페이징 + 컬렉션 엔티티를 함께 조회하려면 어떻게 해야할까? 지금부터 코드도 단순하고, 성능 최적화도 보장하는 매우 강력한 방법..
주문 조회 V3: 엔티티를 DTO로 변환 - 페치 조인 최적화 OrderApiController에 추가 @GetMapping("/api/v3/orders") public List orderV3() { List orders = orderRepository.findAllWithItem(); List result = orders.stream() .map(o -> new OrderDto(o)) .collect(toList()); return result; } OrderRepository에 추가 public List findAllWithItem() { return em.createQuery("select distinct o from Order o" + " join fetch o.member m" + " join ..
주문 조회 V2: 엔티티를 DTO로 변환 @GetMapping("/api/v1/orders") public List ordersV2() { List orders = orderRepository.findAllByCriteria(new OrderSearch()); List result = orders.stream() .map(o -> new OrderDto(o)) .collect(toList()); return result; } OrderApiController에 추가 @Data static class OrderDto { private Long orderId; private String name; private LocalDateTime orderDate; private OrderStatus orderStat..