앞 글에서 살펴보았던 페치 조인보다 조금 더 성능적으로 좋은 방법은,
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 직접 조회
쿼리 방식 선택 권장 순서
- 우선 엔티티를 DTO로 변환하는 방법을 선택한다.
- 필요하면 페치 조인으로 성능을 최적화 한다. 대부분의 성능 이슈가 해결된다.
- 그래도 안되면 DTO로 직접 조회하는 방법을 사용한다.
- 최후의 방법은 JPA가 제공하는 네이티브 SQL이나 스프링 JDBC Template을 사용해서 SQL을 직접 사용한다.
본 내용은 김영한 강사님의 인프런 JPA 강의를 토대로 작성되었습니다.
'Spring > JPA' 카테고리의 다른 글
Spring Pagination 연습 (0) | 2024.03.08 |
---|---|
[SpringBoot] OSIV와 성능 최적화 (0) | 2024.02.01 |
[SpringBoot] JPA Collection 페이징 처리 (0) | 2024.01.29 |
[SpringBoot] JPA Collection 페치 조인 최적화 (0) | 2024.01.29 |
[SpringBoot] JPA 페치 조인 최적화 (0) | 2024.01.26 |