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

gusdn85554님의 프로필 이미지

작성한 질문수

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

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

V4 질문있습니다!

22.01.28 02:35 작성

·

404

0

안녕하세요 영한님 서포터즈님들

 V4에서 OrderQueryRepository 에 있는 findOrders 메서드에 대한 질문입니다.

lazy인데 어떻게 member와 delivery가 같이 조회되는지 이해가 되질 않습니다..

m.name을 알기위해 member 엔티티를 select 해야한다고 생각을 했습니다

혹시 어느 부분이랑 제가 헷갈리는걸까요?

 

해당 단원 qna에서 해당 질문과 비슷한 게 있었는데 fetch join에 대해서만 말씀해주셔서 궁금해서 여쭤보게됐습니다

 

감사합니다

 

 

안녕하세요!! 질문 드리고 답을 기다리는 동안에 계속 찾아보고 생각해봤는데
아직 저 자신한테 납득이 안되서요,, 혹시 맞는지 여쭤보고 싶습니다

API 개발 고급 - 지연 로딩과 조회 성능 최적화 강의에서 V4를 보고왔습니다

제가 의심한 부분은

"일반적인 SQL을 사용할 대 처럼 원하는 값을 선택해서 조회"입니다.

첫 번째 쿼리에 대한 데이터는 이렇게 되어있습니다

지연로딩은 프록시 객체를 만들어서 해당 엔티티의 필드를 사용할 때 DB에서 엔티티를 조회하는 것인데,

바로 DTO를 조회하는 것은 JOIN된 DB 값에서 member의 이름, delivery address 을 바로 뽑아서 값을 가져오기 때문에 JPA에서 엔티티를 조회하지 않아도 값을 알 수 있으며,  다른 select 쿼리가 나가지 않게 되는걸까요?

답변 2

3

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

2022. 01. 29. 16:31

아.. 그러면 제가 질문에서 lazy라는 것 자체가 잘못된 표현이었군요

바로 dto를 조회할 때는 jpa에서 다루는 엔티티가 아닌 정말 db테이블이라 생각하면 되겠네요,, 

이해 확실히 됐습니다 감사합니다 영한님!!!

0

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

2022. 01. 29. 16:25

안녕하세요. gusdn85554님

여기서는 엔티티를 조회하는 것이 아니라 원하는 데이터를 모두 조인해서 한번에 필요한 데이터만 조회하는 방식을 사용했습니다. 이러한 조회 방식을 DTO로 조회하는 방식이라고 일반적으로 이야기합니다.

이렇게 DTO로 조회하게 되면 엔티티가 아닙니다. 따라서 지연로딩, Fetch join등을 사용할 수 없습니다.

이렇게 DTO로 조회하려면 SQL의 JOIN 문을 사용해서 처음부터 원하는 데이터를 모두 선택해서 조회해야 합니다.

감사합니다.