인프런 커뮤니티 질문&답변

kangsy763님의 프로필 이미지

작성한 질문수

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

주문 조회 V4: JPA에서 DTO 직접 조회

findOrders() 질문 있습니다.

해결된 질문

20.07.17 22:37 작성

·

219

4

안녕하세요 영한님 findOrders() 메서드 질문 있습니다!!

앞에서부터 쭉 내용을 봤더니 머릿속이 굉장히 꼬인 것 같네요 ㅎㅎ;

앞서 V3.1 에서 페이징 한계 극복에 사용한 메서드 
findAllWithMemberDelivery 는   to One 을 페이징에 영향을 주지않기 때문에 페치조인을 하였습니다. 

DTO에 직접 적용하는 V4의 경우 findOrders 메서드를 사용하였는데 이 때에도 to One 을 먼저 조인을 시켰습니다.

여기서 궁금한 점이, 이 때에는 왜 fetch 조인을 사용하지 않은 것인지 궁금합니다. 그리고 어째서 lazy 인데도 불구하고 1건으로 조회가 되는지 궁금합니다. 

Select o from Order o 만 하면 lazy이기 때문에 Order만 조회가 되지만 위의 경우는 join 을 해주었기 때문에 delivery와 member가 같이 조회가 되는 건가요? lazy인데 어떻게죠? 만약 그렇다면, findAllWithMemberDelivery() 메서드에서는 굳이 fetch를 왜 시켜준건지도 아리송합니다. 그냥 join해도 toOne 이니깐 row수를 증가시키지않고 딱 되지 않나요 ?? 

이해했던게 막 꼬이네요 ㅜㅜ

답변 2

6

김영한님의 프로필 이미지
김영한
지식공유자

2020. 07. 17. 23:17

안녕하세요. kangsy763님^^

fetch join은 객체 그래프를 조회하는 것이기 때문에 엔티티를 select 하는 경우에만 사용할 수 있습니다.

v4 처럼 데이터를 하나씩 찍어서, DTO로 직접 조회하는 경우에는 fetch join을 사용할 수 없습니다.

정리하는데 도움이 되셨길 바래요^^

3

kangsy763님의 프로필 이미지
kangsy763
질문자

2020. 07. 17. 23:34

아! 그렇다면 DTO 에 바로 조회하지는 않지만 

select m.user name,  o.orderDate

from Order o

join fetch o.member m     과 같이 o 그 자체가 아닌 개별로 골라내는 것도 불가능 하다는 거군요! 감사합니다!!