JPA에서 바로 DTO로 조회하여 극한의 최적화를 해보자.
JPA는 기본적으로 엔티티나 value object만 반환할 수 있다.
public List<OrderSimpleQueryDTO> findOrderDTOs() {
return em.createQuery("select o from Order o " +
"join o.member m " +
"join o.delivery d ", OrderSimpleQueryDTO.class
).getResultList();
}
@GetMapping("/api/v4/simple-orders")
public List<OrderSimpleQueryDTO> ordersV4() {
return orderRepository.findOrderDTOs();
}
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();
}
만약 데이터 사이즈가 엄청 커서 필드가 20, 30개인 경우, 고객 트래픽이 많은 경우는 고민이 필요하지만 보통 페치 조인을 해도 될 듯하다. 결정 방법은 뒤에서 설명
repository는 가급적 순수 엔티티를 조회하는데 써야한다.
해결 방법은?
영한님은 별도의 쿼리용 package, repository를 따로 만든다. 권장 방법