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
2022. 01. 29. 16:31
아.. 그러면 제가 질문에서 lazy라는 것 자체가 잘못된 표현이었군요
바로 dto를 조회할 때는 jpa에서 다루는 엔티티가 아닌 정말 db테이블이라 생각하면 되겠네요,,
이해 확실히 됐습니다 감사합니다 영한님!!!
0
2022. 01. 29. 16:25
안녕하세요. gusdn85554님
여기서는 엔티티를 조회하는 것이 아니라 원하는 데이터를 모두 조인해서 한번에 필요한 데이터만 조회하는 방식을 사용했습니다. 이러한 조회 방식을 DTO로 조회하는 방식이라고 일반적으로 이야기합니다.
이렇게 DTO로 조회하게 되면 엔티티가 아닙니다. 따라서 지연로딩, Fetch join등을 사용할 수 없습니다.
이렇게 DTO로 조회하려면 SQL의 JOIN 문을 사용해서 처음부터 원하는 데이터를 모두 선택해서 조회해야 합니다.
감사합니다.