본문 바로가기
Spring/JPA

[SpringBoot] Repository에서 DTO로 바로 조회

by 진꿈청 2024. 1. 28.

앞 글에서 살펴보았던 페치 조인보다 조금 더 성능적으로 좋은 방법은,

 

Repository에서 DTO로 바로 조회하는 방법이다.

 

코드

    @Query("select new jpabook.jpashop.repository.OrderSimpleQueryDto(o.id, m.name, o.orderDate, o.status, d.address)" +
            "from Order o" +
            " join o.member m" +
            " join o.delivery d")
    public List<OrderSimpleQueryDto> findOrderDtos();

 

 

 

페치 조인 사용시 나가는 쿼리

    select
        o1_0.order_id,
        d1_0.delivery_id,
        d1_0.city,
        d1_0.street,
        d1_0.zipcode,
        d1_0.status,
        m1_0.member_id,
        m1_0.city,
        m1_0.street,
        m1_0.zipcode,
        m1_0.name,
        o1_0.order_date,
        o1_0.status 
    from
        orders o1_0 
    join
        member m1_0 
            on m1_0.member_id=o1_0.member_id 
    join
        delivery d1_0 
            on d1_0.delivery_id=o1_0.delivery_id

 

 

Repository에서 DTO로 바로 조회시 나가는 쿼리

    select
        o1_0.order_id,
        m1_0.name,
        o1_0.order_date,
        o1_0.status,
        d1_0.city,
        d1_0.street,
        d1_0.zipcode 
    from
        orders o1_0 
    join
        member m1_0 
            on m1_0.member_id=o1_0.member_id 
    join
        delivery d1_0 
            on d1_0.delivery_id=o1_0.delivery_id

 

페치 조인과 달리 Repository에서 DTO로 바로 조회하면,

DB의 프로젝션 작업에서 딱 필요한 것들만 조회하기 때문에 성능이 좋다.

 

그러나,

DTO로 직접 조회하는 방법은 DTO에 따라 API 스펙이 결정이 나버리기 때문에,

페치 조인에 비해 재사용성이 좋지 못하다.

 

따라서, 어드민 API가 아닌 일반 사용자들이 사용하는 API일 때 DTO 직접 조회를 고려해보는 것이 좋다.

장단점이 존재하므로 개발시 적절한 트레이드 오프가 필요해 보인다.

 

성능: 페치 조인 < DTO 직접 조회

재사용성: 페치 조인 > DTO 직접 조회

 

 

쿼리 방식 선택 권장 순서

  1. 우선 엔티티를 DTO로 변환하는 방법을 선택한다.
  2. 필요하면 페치 조인으로 성능을 최적화 한다. 대부분의 성능 이슈가 해결된다.
  3. 그래도 안되면 DTO로 직접 조회하는 방법을 사용한다.
  4. 최후의 방법은 JPA가 제공하는 네이티브 SQL이나 스프링 JDBC Template을 사용해서 SQL을 직접 사용한다.

 

 

본 내용은 김영한 강사님의 인프런 JPA 강의를 토대로 작성되었습니다.