참고 : [실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화] - 김영한
V2, V2의 경우 엔티티를 조회해서 DTO로 중간에 변환하는 방식이었다.
이번에는 JPA에서 DTO로 바로 끄집어내어 조회하는 방법을 알아보자.
이전 버전의 SimpleOrderDto의 경우 Controller에 있었다.
이번 버전에서 repository의 메서드를 생성할때 이 DTO가 필요한데, 의존관계가 리파지토리->컨트롤러 로 생길 수 있기 때문에 repository 패키지에 DTO클래스를 따로 생성하였다.
repository/SimpleOrderQueryDto.java
@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;
}
}
OrderSimpleApiController
@GetMapping("api/v4/simple-orders")
public List<OrderSimpleQueryDto> ordersV4(){
return orderRepository.findOrderDtos();
}
OrderRepository
public List<OrderSimpleQueryDto> findOrderDtos() {
return em.createQuery(
"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", OrderSimpleQueryDto.class)
.getResultList();
}
new 키워드를 사용하여 DTO를 직접 생성엔티티를 DTO로 변환하거나, DTO로 바로 조회하는 두가지 방법은 각각 장단점이 있다. 둘중 상황에 따라서 더 나은 방법을 선택하면 된다. 엔티티로 조회하면 리포지토리 재사용성도 좋고, 개발도 단순해진다. 따라서 권장하는 방법은 다 음과 같다.
쿼리 방식 선택 권장 순서
1. 우선 엔티티를 DTO로 변환하는 방법을 선택한다.
2. 필요하면 페치 조인으로 성능을 최적화 한다. 대부분의 성능 이슈가 해결된다.
3. 그래도 안되면 DTO로 직접 조회하는 방법을 사용한다.
4. 최후의 방법은 JPA가 제공하는 네이티브 SQL이나 스프링 JDBC Template을 사용해서 SQL을 직접 사용한다.
