-
[스프링부트/웹 애플리케이션 개발]API 개발 고급-5Spring&SpringBoot 2023. 1. 12. 23:48
간단한 주문 조회 V4 : JPA에서 DTO로 바로 조회
@GetMapping("/api/v4/simple-orders") public List<OrderSimpleQueryDto> ordersV4() { return orderRepository.findOrderDtos(); }
package jpabook.jpashop.repository; import jpabook.jpashop.domain.Address; import jpabook.jpashop.domain.OrderStatus; import java.time.LocalDateTime; @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; } }
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 fetch o.member m" + " join fetch o.delivery d", OrderSimpleQueryDto.class) .getResultList(); }
- 내가 원하는 것만 찾도록 쿼리가 짧아졌다
- new 명령어를 사용해서 JPQL의 결과를 DTO로 즉시 변환
- SELECT 절에서 원하는 데이터를 직접 선택하므로 DB 애플리케이션 네트워크 용량 최적화(생각보다 미비)
- 리포지토리 재사용성 떨어짐, API 스펙에 맞춘 코드가 리포지토리에 들어가는 단점
> 해결법
>> repository.ordor.simplequery 패키지 생성
>> OderSimpleQueryDto, OderSimpleQueryRepository 생성
>> repository는 가급적 순수한 엔티티를 조회할 때 사용하도록 하기 위해, 유지보수성 좋음
- v3와 v4의 중 성능 좋은 것은?
> v3는 내부에 내가 원하는 것만 fetch join으로 성능 튜닝을 했던 것, 재사용성 높음
> v3는 엔티티를 조회했기 때문에 비즈니스 로직으로 데이터 변경 가능
> v4는 쿼리를 실제로 입력해서 가져온 것, 화면에는 최적화되었지만 재사용성 낮음, 조금 더 성능은 좋음
> dto를 조회했기 때문에 변경 자체가 불가능, 코드상 조금 더 지저분함
>> 엔티티를 DTO로 변환하거나, DTO로 바로 조회하는 두가지 방법은 각각 장단점이 있다. 둘 중 상황에 따라서 더 나은 방법을 선택하면 된다. 엔티티로 조회하면 리포지토리 재사용성도 좋고, 개발도 단순해진다. 따라서 권장하는 방법은 다음과 같다.
쿼리 방식 선택 권장 순서
1. 우선 엔티티를 DTO로 변환하는 방법을 선택한다.
2. 필요하면 페치 조인으로 성능을 최적화 한다. 대부분(95%)의 성능 이슈가 해결된다.
3. 그래도 안되면 DTO로 직접 조회하는 방법을 사용한다.
4. 최후의 방법은 JPA가 제공하는 네이티브 SQL이나 스프링 JDBC Template을 사용해서 SQL을 직접 사용한다.
728x90'Spring&SpringBoot' 카테고리의 다른 글
[스프링부트/웹 애플리케이션 개발]API 개발 고급 - 컬렉션 조회 최적화 -3 (0) 2023.01.13 [스프링부트/웹 애플리케이션 개발]API 개발 고급 - 컬렉션 조회 최적화 -1,2 (0) 2023.01.13 [스프링부트/웹 애플리케이션 개발]API 개발 고급-4 (1) 2023.01.12 [스프링부트/웹 애플리케이션 개발]API 개발 고급-3 (0) 2023.01.12 [스프링부트/웹 애플리케이션 개발]API 개발 고급-2 (0) 2023.01.11