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

Ch03. API 개발 고급(지연 로딩과 조회 성능 최적화) - 간단한 주문 조회 V4(JPA에서 DTO로 바로 조회)

webmaster 2021. 12. 20. 12:58
728x90

Select 절에서 내가 원하는 것만 뽑을 수 있다.

Select 프로젝션

public List<OrderSimpleQueryDto> findOrderDtos() {
    return em.createQuery("select new jpabook.jpashop.dto.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();
}

select절에서 내가 원하는 데이터만 뽑는다.(셀랙트 프로젝션)

Repository

@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();
    }
}
  • v3 - v4 차이 
    • v4는 재사용성이 안된다 -> v3쿼리는 여러 곳에서 사용할 수 있지만, v4는 다른 곳에서 사용하지 못한다.
    • 단, v4가 성능상 더 최적화되어 있다.
  • 일반적인 SQL을 사용할 때처럼 원하는 값을 선택해서 조회
  • new 명령어를 사용해서 JPQL의 결과를 DTO로 즉시 변환
  • SELECT 절에서 원하는 데이터를 직접 선택하므로 DB 애플리케이션 네트워크 용량 최적화(생각보다 미비)
  • 리포지토리 재사용성 떨어짐, API 스펙에 맞춘 코드가 리포지토리에 들어가는 단점(API 스펙에 맞춰 레포지토리를 짜기 때문에 문제인 거다)
    • API 스펙을 변경하면 당장 Repository를 수정해야 된다.
  • 화면 전용 레포지토리를 만들어서 온전히 화면 디펜던시하게 만들어서 유지보수가 좋게 작성한다.

쿼리 방식 선택 권장 순서

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