728x90
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();
}

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를 수정해야 된다.
- 화면 전용 레포지토리를 만들어서 온전히 화면 디펜던시하게 만들어서 유지보수가 좋게 작성한다.
쿼리 방식 선택 권장 순서
- 우선 엔티티를 DTO로 변환하는 방법을 선택한다.
- 필요하면 페치 조인으로 성능을 최적화 한다. 대부분의 성능 이슈가 해결된다.
- 그래도 안되면 DTO로 직접 조회하는 방법을 사용한다.
- 최후의 방법은 JPA가 제공하는 네이티브 SQL이나 스프링 JDBC Template을 사용해서 SQL을 직접 사용한다.
728x90
'실전! 스프링 부트와 JPA 활용2(API 개발과 성능 최적화)' 카테고리의 다른 글
| Ch04. API 개발 고급(컬렉션 조회 최적화) - 주문 조회 V2(Entity -> DTO로 변환) (0) | 2021.12.21 |
|---|---|
| Ch04. API 개발 고급(컬렉션 조회 최적화) - 주문 조회 V1(엔티티 직접 노출) (0) | 2021.12.21 |
| Ch03. API 개발 고급(지연 로딩과 조회 성능 최적화) - 간단한 주문 조회 V3(Entity -> DTO로 변환(페치 조인 최적화)) (0) | 2021.12.20 |
| Ch03. API 개발 고급(지연 로딩과 조회 성능 최적화) - 간단한 주문 조회 V2(Entity -> DTO로 변환) (0) | 2021.12.20 |
| Ch03. API 개발 고급(지연 로딩과 조회 성능 최적화) - 간단한 주문 조회 V1(엔티티를 직접 노출) (0) | 2021.12.20 |