3. API 개발 고급: 지연 로딩과 조회 성능 최적화 - 간단한 주문 조회 (4) - V4: JPA에서 DTO로 바로 조회
1. OrderSimpleQueryDto
- [jd
- [jd
SimpleOrderDto와 달리 생성자로 각 필드의 값을 받는 OrderSimpleQueryDto 클래스를 다음과 같이 작성
- [jd
SimpleOrderDto와 달리 생성자로 각 필드의 값을 받는 OrderSimpleQueryDto 클래스를 다음과 같이 작성
SimpleOrderDto와 달리 생성자로 각 필드의 값을 받는 OrderSimpleQueryDto 클래스를 다음과 같이 작성
- [jd
- [jd
JPQL의 new 오퍼레이션에서는 엔티티를 넘길 수가 없음
- [jd
JPQL의 new 오퍼레이션에서는 엔티티를 넘길 수가 없음
JPQL의 new 오퍼레이션에서는 엔티티를 넘길 수가 없음
- [jd
- [jd
엔티티를 넘기면, 엔티티가 식별자로 넘어감
- [jd
엔티티를 넘기면, 엔티티가 식별자로 넘어감
엔티티를 넘기면, 엔티티가 식별자로 넘어감
- [jd
- [jd
- [jd
- [jd
반면 Address는 Value Type이기 때문에 값처럼 동작
- [jd
- [jd
- [jd
반면 Address는 Value Type이기 때문에 값처럼 동작
- [jd
- [jd
반면 Address는 Value Type이기 때문에 값처럼 동작
- [jd
반면 Address는 Value Type이기 때문에 값처럼 동작
반면 Address는 Value Type이기 때문에 값처럼 동작
- [jd
- [jd
이전과 달리 OrderSimpleApiController.java 내에 작성하지 않는 이유는 의존 관계 문제가 생기는 것을 방지하기 위함
- [jd
이전과 달리 OrderSimpleApiController.java 내에 작성하지 않는 이유는 의존 관계 문제가 생기는 것을 방지하기 위함
이전과 달리 OrderSimpleApiController.java 내에 작성하지 않는 이유는 의존 관계 문제가 생기는 것을 방지하기 위함
- [jd
- [jd
repository가 controller에 의존하는 이상한 사태가 벌어질 수 있음
- [jd
repository가 controller에 의존하는 이상한 사태가 벌어질 수 있음
repository가 controller에 의존하는 이상한 사태가 벌어질 수 있음
2. OrderSimpleQueryRepository.findOrderDtos()
- [jd
- [jd
findOrderDtos() 메소드는 일반적인 SQL을 사용할 때처럼 원하는 값을 선택해 조회
- [jd
findOrderDtos() 메소드는 일반적인 SQL을 사용할 때처럼 원하는 값을 선택해 조회
findOrderDtos() 메소드는 일반적인 SQL을 사용할 때처럼 원하는 값을 선택해 조회
- [jd
new 명령어를 사용해 JPQL의 결과를 DTO로 즉시 변환
new 명령어를 사용해 JPQL의 결과를 DTO로 즉시 변환
- [jd
- [jd
해당 메소드 호출 시 생성되는 쿼리는 다음과 같음
- [jd
해당 메소드 호출 시 생성되는 쿼리는 다음과 같음
해당 메소드 호출 시 생성되는 쿼리는 다음과 같음
- [jd
- [jd
쿼리가 1번 나감
- [jd
쿼리가 1번 나감
쿼리가 1번 나감
- [jd
orders와 member, orders와 delivery를 조인
orders와 member, orders와 delivery를 조인
- [jd
- [jd
- [jd
- [jd
select절에서 원하는 값만 선택한 것이 V3와의 차이점
- [jd
- [jd
- [jd
select절에서 원하는 값만 선택한 것이 V3와의 차이점
- [jd
- [jd
select절에서 원하는 값만 선택한 것이 V3와의 차이점
- [jd
select절에서 원하는 값만 선택한 것이 V3와의 차이점
select절에서 원하는 값만 선택한 것이 V3와의 차이점
- [jd
- [jd
SELECT 절에서 원하는 데이터를 직접 선택하므로, DB에서 애플리케이션으로의 네트워크 용량 최적화가 가능
- [jd
SELECT 절에서 원하는 데이터를 직접 선택하므로, DB에서 애플리케이션으로의 네트워크 용량 최적화가 가능
SELECT 절에서 원하는 데이터를 직접 선택하므로, DB에서 애플리케이션으로의 네트워크 용량 최적화가 가능
- [jd
- [jd
하지만 요즘은 네트워크 성능이 좋아져 최적화가 생각보다 미비
- [jd
하지만 요즘은 네트워크 성능이 좋아져 최적화가 생각보다 미비
하지만 요즘은 네트워크 성능이 좋아져 최적화가 생각보다 미비
- [jd
실무에서 사용할 때는 성능 테스트를 수행해보기로
실무에서 사용할 때는 성능 테스트를 수행해보기로
- [jd
- [jd
API 스펙에 맞춘 코드가 리포지토리에 들어가, 리포지토리의 재사용성이 떨어지는 단점이 존재
- [jd
API 스펙에 맞춘 코드가 리포지토리에 들어가, 리포지토리의 재사용성이 떨어지는 단점이 존재
API 스펙에 맞춘 코드가 리포지토리에 들어가, 리포지토리의 재사용성이 떨어지는 단점이 존재
- [jd
- [jd
Repository가 API에 의존하고 있기 때문에, 물리적으로는 계층이 나뉘어져 있지만 논리적으로는 계층이 다 깨져 있음
- [jd
Repository가 API에 의존하고 있기 때문에, 물리적으로는 계층이 나뉘어져 있지만 논리적으로는 계층이 다 깨져 있음
Repository가 API에 의존하고 있기 때문에, 물리적으로는 계층이 나뉘어져 있지만 논리적으로는 계층이 다 깨져 있음
- [jd
API 스펙이 Repository에 들어오는 것을 막기 위해, 예제에서는 쿼리용 메소드를 위한 클래스인 OrderSimpleQueryRepository를 따로 작성
API 스펙이 Repository에 들어오는 것을 막기 위해, 예제에서는 쿼리용 메소드를 위한 클래스인 OrderSimpleQueryRepository를 따로 작성
- [jd
- [jd
Repository는 가급적 순수한 엔티티 조회에 사용
- [jd
Repository는 가급적 순수한 엔티티 조회에 사용
Repository는 가급적 순수한 엔티티 조회에 사용
3. OrderSimpleApiController.ordersV4()
- [jd
- [jd
orderSimpleQueryRepository의 findOrderDtos()를 이용해 반환 받은 DTO의 List를 바로 반환
- [jd
orderSimpleQueryRepository의 findOrderDtos()를 이용해 반환 받은 DTO의 List를 바로 반환
orderSimpleQueryRepository의 findOrderDtos()를 이용해 반환 받은 DTO의 List를 바로 반환
4. 정리
- [jd
- [jd
엔티티를 DTO로 변환하거나, DTO로 바로 조회하는 두 방법은 각각 장단점이 존재하므로, 둘 중 상황에 따라 더 나은 방법을 선택하면 됨
- [jd
엔티티를 DTO로 변환하거나, DTO로 바로 조회하는 두 방법은 각각 장단점이 존재하므로, 둘 중 상황에 따라 더 나은 방법을 선택하면 됨
엔티티를 DTO로 변환하거나, DTO로 바로 조회하는 두 방법은 각각 장단점이 존재하므로, 둘 중 상황에 따라 더 나은 방법을 선택하면 됨
- [jd
- [jd
코드 상으로는 엔티티 조회가 더 좋고, 성능 상으로는 DTO 조회가 더 좋음
- [jd
코드 상으로는 엔티티 조회가 더 좋고, 성능 상으로는 DTO 조회가 더 좋음
코드 상으로는 엔티티 조회가 더 좋고, 성능 상으로는 DTO 조회가 더 좋음
- [jd
- [jd
엔티티 조회가 리포지토리 재사용성도 좋아지고 개발도 단순해지니, 우선 엔티티를 DTO로 변환하는 방법 선택
- [jd
엔티티 조회가 리포지토리 재사용성도 좋아지고 개발도 단순해지니, 우선 엔티티를 DTO로 변환하는 방법 선택
엔티티 조회가 리포지토리 재사용성도 좋아지고 개발도 단순해지니, 우선 엔티티를 DTO로 변환하는 방법 선택
- [jd
필요하면 fetch join으로 성능을 최적화
필요하면 fetch join으로 성능을 최적화
- [jd
- [jd
대부분의 성능 이슈가 해결됨
- [jd
대부분의 성능 이슈가 해결됨
대부분의 성능 이슈가 해결됨
- [jd
- [jd
그래도 성능 이슈가 해결되지 않으면, DTO로 직접 조회하는 방법을 사용
- [jd
그래도 성능 이슈가 해결되지 않으면, DTO로 직접 조회하는 방법을 사용
그래도 성능 이슈가 해결되지 않으면, DTO로 직접 조회하는 방법을 사용
- [jd
최후의 방법은 JPA가 제공하는 네이티브 SQL이나 스프링 JDBC Template을 사용해 SQL을 직접 사용
최후의 방법은 JPA가 제공하는 네이티브 SQL이나 스프링 JDBC Template을 사용해 SQL을 직접 사용
- [jd
- [jd
- [jd
- [jd
- [jd
- [jd
- [jd
- [jd
- [jd
- [jd
- [jd
- [jd
- [jd
- [jd
- [jd
- [jd
- [jd
- [jd
- [jd
- [jd
- [jd
- [jd
- [jd
- [jd
- [jd
- [jd