tevelop RSS 태그 관리 글쓰기 방명록
2023-01-29 20:49:25

주문조회 V3: 엔티티를 DTO로 변환 - 페치 조인 최적화

public List<Order> findAllWithItem() {
    return em.createQuery(
            "select distinct o from Order o" +
                    " join fetch o.member m" +
                    " join fetch o.delivery d" +
                    " join fetch o.orderItems oi" +
                    " join fetch oi.item i ", Order.class
    ).getResultList();
}
@GetMapping("/api/v3/orders")
public List<OrderDto> ordersV3() {
    List<Order>orders= orderRepository.findAllWithItem();
    List<OrderDto>result=orders.stream()
            .map(o-> new OrderDto(o))
            .collect(Collectors.toList());
    returnresult;
}
  • 페치 조인으로 SQL이 1번만 실행됨
  • distinct를 사용한 이유는 1대 다 조인이 있으므로 데이터베이스 row 가 증가한다. 그 결과 같은 order 엔티티의 조회 수도 증가하게 된다. JPA의 distinct는 SQL에 distinct를 추가하고, 더해서 같은 엔티티가 조회되면, 애플리케이션에서 중복을 걸러준다. 이 예에서 order가 컬렉션 페치 조인 때문에 중복 조회 되는 것을 막아준다.
  • 단점 - 페이징 불가능

'내일배움캠프 > TIL' 카테고리의 다른 글

2023/1/26  (0) 2023.01.26
2023/1/17  (0) 2023.01.17
2023/1/16  (0) 2023.01.16
2023/1/13  (0) 2023.01.13
2022/1/12  (0) 2023.01.12
tevelop. Designed by 코딩재개발.