JPA

페치 조인(fetch join) 의 활용

쿠카이든 2022. 2. 14. 12:38
728x90
  • (JPA) 페치 조인(fetch join) 의 활용
    • JPQL에서 성능 최적화를 위해 제공하는기능입니다.
    • 연관된 엔티티나 컬렉션을 SQL 한 번에 함께 조회하는 기능입니다.
      • join fetch 명령어를 사용합니다.
  • 페치 조인 예(v1(안쓴 버전), v2(쓴 버전) 비교)
/**
 * V1. 엔티티를 조회해서 DTO로 변환(fetch join 사용X)
 * - 단점: 지연로딩으로 쿼리 N번 호출
 */
@GetMapping("/api/v1/simple-orders")
public List<SimpleOrderDto> ordersV1() {
  List<Order> orders = orderRepository.findAll();
  List<SimpleOrderDto> result = orders.stream()
      .map(o -> new SimpleOrderDto(o))
      .collect(toList());
  return result;
}

@Data
static class SimpleOrderDto {
  private Long orderId;
  private String name;
  private LocalDateTime orderDate; //주문시간
  private OrderStatus orderStatus;
  private Address address;
  public SimpleOrderDto(Order order) {
      orderId = order.getId();
      name = order.getMember().getName();
      orderDate = order.getOrderDate();
      orderStatus = order.getStatus();
      address = order.getDelivery().getAddress();
  }
}
  • 엔티티를 DTO로 변환하는 일반적인 방법
    • 쿼리가 총 1 + N + N번 실행됩니다.
    • order 조회 1번(order 조회 결과 수가 N이 됩니다.)
    • order -> member 지연 로딩 조회 N 번 order -> delivery 지연 로딩 조회 N 번
      • 예) order의 결과가 4개면 최악의 경우 1 + 4 + 4번 실행됩니다.(최악의 경우)
  • 페치 조인 최적화 예
@GetMapping("/api/v2/simple-orders")
public List<SimpleOrderDto> ordersV2() {
    List<Order> orders = orderRepository.findAllWithMemberDelivery();
    List<SimpleOrderDto> result = orders.stream()
        .map(o -> new SimpleOrderDto(o))
        .collect(toList());
    return result;
}

//OrderRepository 추가 코드
public List<Order> findAllWithMemberDelivery() {
    return em.createQuery(
        "select o from Order o" +
            " join fetch o.member m" +
            " join fetch o.delivery d", Order.class)
        .getResultList();
}
  • 엔티티를 페치 조인(fetch join)을 사용해서 쿼리 1번에 조회
  • 페치 조인으로 order -> member , order -> delivery 는 이미 조회 된 상태 이므로 지연로딩X

 

728x90

'JPA' 카테고리의 다른 글

스프링 데이터 JPA 란?  (0) 2022.02.15
QueryDSL 소개  (0) 2022.02.15
회원등록 API v1, v2 차이  (0) 2022.02.14
변경 감지(dirty check)와 병합(merge)  (0) 2022.02.14
(Querydsl) ON 절을 활용한 조인  (0) 2022.02.14