작성
·
433
·
수정됨
0
우선 저의 코드부터 올려보겠습니다.
@Query("select m from Member m left join m.team t")
List<Member> findmemberByLeftJoin();
저의 코드는 JPQL에서 left join fetch를 하지 않고 left join만 걸었습니다.
강의 내용에 의하면 단순 joinAll()을 하였을 때 영속성 컨텍스트로부터 proxy객체를 일단은 주입한다고 하셨습니다.
저의 경우는 @Query를 활용하여 다음과 같은 JPQL을 선언하였을 때, Console에 출력되는 내용은 아래와 같습니다.
left join은 걸리지만 Select절에는 Member에 대한 데이터만 불러올 뿐, Team에 대한 데이터는 불러오지 않고 있습니다.
그렇다면 이때 Team을 getClass로 출력할때 proxy객체일거라 생각했습니다.
하지만 직접 출력해보니 class study.datajpa.entity.Team 이렇게 출력이 됩니다.
이것은 조회는 하지 않았으나, 프록시객체를 반환하지는 않고 진짜 객체로 반환한다는 뜻인데...
여기서부터 햇갈리기 시작합니다.
어떻게 이해하고 받아들여야 할까요?
1. 쿼리상에서는 Team을 불러오지 않는데, 어떻게 객체탐색을 통해 Team 객체가 조회가 되나요?
2. 쿼리상에서는 Team을 불러오지 않는데, 어째서 Proxy객체가 아닌 진짜 엔티티인가요?
3. 결국 이런 현상은 패치조인과 다른 것 이라고 이해해야 할까요?
(이 현상은 inner Join에서도 발생합니다)
* left조인은 걸리고, select절에 team은 없지만
* n+1이 발생하지 않고도 team이 조회되는 이유
* 프록시 객체가 아닌 진짜 team객체를 반환해주는 이유
답변 2
0
안녕하세요. kate님
도움을 드리고 싶지만 질문 내용만으로는 답변을 드리기 어렵습니다.
실제 동작하는 코드 전체를 확인해봐야 할 것 같아요.
실제 동작하는 전체 프로젝트를 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.
구글 드라이브 업로드 방법은 다음을 참고해주세요.
주의: 업로드시 링크에 있는 권한 문제 꼭 확인해주세요
추가로 다음 내용도 코멘트 부탁드립니다.
1. 문제 영역을 실행할 수 있는 방법
2. 문제가 어떻게 나타나는지에 대한 상세한 설명
감사합니다.
0
안녕하세요, 인프런 AI 인턴이에요.
쿼리 실행 시 left join만 하고 fetch를 하지 않은 경우에는 Member 엔티티와 Team 엔티티를 조인하고, Member 엔티티만 select하는 것입니다. 이 때, left join을 통해 모든 Member 데이터는 조회가 됩니다. 이후에 프록시 객체를 생성하지 않고, 실제 Team 엔티티를 조회합니다. 이렇게 실제 데이터를 조회하여 쿼리 결과로 가져오게 됩니다. 그래서 결과로 출력되는 Team 객체는 프록시 객체가 아니라, 실제 객체가 반환된 것입니다.
즉, left join을 할 때는 모든 데이터가 조회된 후, Team 엔티티까지 프록시 객체로 조회하여 필요할 때 데이터를 가져옵니다. 그러나 left join fetch를 할 때는 한번에 필요한 데이터까지 모두 조회하게 되어, 프록시 객체를 생성하지 않습니다.
추가로, JPQL에서 left join fetch를 하지 않고 left join만 하는 경우에는, 영속성 컨텍스트를 거치지 않고 DB에서 데이터를 조회하기 때문에, N+1 문제가 발생할 수 있습니다. 이 부분도 주의해주세요.
이상입니다. 더 궁금하신 점이 있다면 언제든지 물어보세요. 감사합니다.