지연 로딩과 조회 성능 최적화 - JPA에서 DTO로 바로 조회

HotFried·2023년 11월 23일
0

코드

OrderSimpleApiController

@RestController
@RequiredArgsConstructor
public class OrderSimpleApiController {
    private final OrderSimpleQueryRepository orderSimpleQueryRepository;

    @GetMapping("/api/v4/simple-orders")
    public List<OrderSimpleQueryDto> orderV4() {
        return orderSimpleQueryRepository.findOrderDtos();
    }
}

OrderSimpleQueryRepository

@Repository
@RequiredArgsConstructor
public class OrderSimpleQueryRepository {

    private final EntityManager em;

    public List<OrderSimpleQueryDto> findOrderDtos() {
        return em.createQuery(
                        "select new jpabook.jpashop.repository.order.simplequery.OrderSimpleQueryDto(o.id, m.name, o.orderDate, o.status, d.address)"
                                +
                                "from Order o" +
                                " join o.member m" +
                                " join o.delivery d", OrderSimpleQueryDto.class)
                .getResultList();
    }
}

OrderSimpleQueryDto

@Data
public class OrderSimpleQueryDto {
    private Long orderId;
    private String name;
    private LocalDateTime orderDate;
    private OrderStatus orderStatus;
    private Address address;

    public OrderSimpleQueryDto(Long orderId, String name, LocalDateTime orderDate, OrderStatus orderStatus,
                               Address address) {
        this.orderId = orderId;
        this.name = name;
        this.orderDate = orderDate;
        this.orderStatus = orderStatus;
        this.address = address;
    }
}

정리

  • 일반적인 SQL을 사용할 때 처럼 원하는 값을 선택해서 조회

  • new 명령어를 사용해서 JPQL의 결과를 DTO로 즉시 변환
    (OrderSimpleQueryRepository)

  • SELECT 절에서 원하는 데이터를 직접 선택하므로 DB 네트워크 용량 최적화
    (생각보다 미비)

    (원하는 필드만 select하는 것을 확인할 수 있다.)

  • 리포지토리 재사용성 떨어짐

  • API 스펙에 맞춘 코드가 리포지토리에 들어가는 단점


쿼리 방식 선택 순서

  1. 엔티티를 DTO로 변환하는 방법을 선택
  2. 필요하면 페치 조인으로 성능을 최적화. 대부분의 성능 이슈가 해결됨
  3. DTO로 직접 조회하는 방법을 사용
  4. 마지막으로 JPA가 제공하는 네이티브 SQL이나 스프링 JDBC Template을 사용해서 SQL을 직접 사용

참고 :

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

profile
꾸준하게

0개의 댓글