프로그래밍/spring boot

[스프링부트] 실전! 스프링 부트와 JPA 활용2 지연 로딩과 조회 성능 최적화 #1 간단한 주문 조회 V3: 엔티티를 DTO로 변환 - 페치 조인 최적화

aSpring 2023. 11. 25. 20:00
728x90
728x90
※ 본 포스팅은 김영한 강사님의 인프런 '실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화' 강의를 들으며 작성한 수강일지 입니다.

 
 

 

| API 개발 고급 - 지연 로딩과 조회 성능 최적화

1. 간단한 주문 조회 V1: 엔티티를 직접 노출
2. 간단한 주문 조회 V2: 엔티티를 DTO로 변환
3. 간단한 주문 조회 V3: 엔티티를 DTO로 변환 - 페치 조인 최적화
4. 간단한 주문 조회 V4: JPA에서 DTO로 바로 조회

 

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

OrderSimpleApiController - 추가

@GetMapping("/api/v3/simple-orders")
public List<SimpleOrderDto> ordersV3() {
    List<Order> orders = orderRepository.findAllWithMemberDelivery();
    List<SimpleOrderDto> result = orders.stream()
            .map(o -> new SimpleOrderDto(o))
            .collect(Collectors.toList());

    return result;
}

 

 

OrderRepository - 추가 코드

public List<Order> findAllWithMemberDelivery() {
    // fetch join -> 이 경우 LAZY 다 무시하고 멤버, 딜리버리까지 해서 다 가지고 옴
    // 성능 최적화를 위해 자주 사용
    return em.createQuery(
            "select o from Order o" +
                    " join fetch o.member m" +
                    " join fetch o.delivery d", Order.class
    ).getResultList();
}
  • 엔티티를 페치 조인(fetch join)을 사용해서 쿼리 1번에 조회
    • v2는 5번의 쿼리가 나가는데 v3는 한 번의 쿼리만으로 같은 결과를 얻어 옴
  • 페치 조인으로 order -> member , order -> delivery 는 이미 조회 된 상태 이므로 지연로딩X
    • order에 member, delivery 객체가 같이 조회되어 나옴
728x90
728x90