[4.5 주문 조회 V4] DTO 직접 조회<컬렉션> - N+1 문제 발생
기존의 Repository는 순수한 엔티티를 조회할때 사용하고
queryRepository는 API 에 의존관계가 있는 부분을 서로 때어내려고 패키지를 만들었다(화면과 관련된 부분)
리포지토리에서 OrderApiController 에 있는 dto 와 내용이 같지만 쓰지않는 이유는
리포지토리에서 컨트롤러를 의존하는 상황이 되어서 그렇다 - 의존관계가 순환된다
orderQueryDto 를 알아야해서 같은 패키지안에 넣어주었다
OrderApiController.java
OrderQueryRepository.java
OrderQueryDto.java
OrderItemQueryDto.java
Query: 루트 1번, 컬렉션 N 번 실행
ToOne(N:1, 1:1) 관계들을 먼저 조회하고, ToMany(1:N) 관계는 각각 별도로 처리한다.
이런 방식을 선택한 이유는 다음과 같다.
ToOne 관계는 조인해도 데이터 row 수가 증가하지 않는다. (단순 join)
ToMany(1:N) 관계는 조인하면 row 수가 증가한다.
row 수가 증가하지 않는 ToOne 관계는 조인으로 최적화 하기 쉬우므로 한번에 조회하고, ToMany 관계는 최적화 하기 어려우므로 findOrderItems() 같은 별도의 메서드로 조회한다.
결과적으로 N+1 이다
루트 1번 -> 루트 결과 개수 만큼 추가 쿼리 N번
-> 최적화 방법을 다음시간에 알아보자