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

이원태님의 프로필 이미지

작성한 질문수

자바 ORM 표준 JPA 프로그래밍 - 기본편

일반 조인과 fetch join 차이에 대해 질문이 있습니다.

22.01.10 14:30 작성

·

282

0

섹션 11. 객체지향 쿼리 언어2- 중급 문법 내의 "페치 조인1 - 기본" 강의를 듣고 작성하는 질문입니다. 

 

안녕하세요 :)

 

https://www.inflearn.com/questions/164472

https://www.inflearn.com/questions/170331

 

Q1)

제가 헷갈리는 부분과 관련해서 질문들이 있길래 다 살펴봤지만, 제가 명확하게 이해한 것인지 확신을 할 수 없어서 이렇게 질문 남깁니다.

 

일반 조인 -> 두 객체를 돌려받음, 객체 그래프 채워짐

(객체 그래프가 채워질 꺼라 생각한 이유는, https://www.inflearn.com/questions/170331 의 강사님 답변 "Object[]은 각각 따로 조회하기 때문에 이런 부분을 처리할 때 작업 공수가 많이 들어갑니다." 이 내포하는 뜻이 두 조인의 내부적인 동작에서는 차이가 있지만 결과는 똑같다고 생각해서입니다.)

페치 조인 -> 한 객체를 돌려받음, 객체 그래프 채워짐

 

제가 이해한 내용이 맞을까요?

 

Q2)

일반 조인시에도 객체 그래프가 채워지는 지 확인하기 위해서, 코드를 직접 짜서 테스트를 돌려봤는데 이해하기 힘든 쿼리가 나가서 추가적으로 질문 남깁니다.

(위의 질문에 대한 답변과 유사성이 있을까싶어, 한 질문란에 두개의 질문을 남깁니다. 아니라면 죄송합니다 ㅠㅠ)

 

해당 테스트 관련 코드와 결과화면을 첨부해두겠습니다.

일반 조인을 통해 작성한 쿼리를 em.createQuery()... 를 통해 결과리스트를 반환받고 하나씩 반복문을 통해 돌려보는데, select query가 추가로 나가는 것을 발견했습니다.

member 에서 team 을 조회할 때는 쿼리가 추가로 발생하지 않는데, team에서 member를 조회할 때에 쿼리가 추가로 발생합니다.

처음 작성한 query를 통해 member를 다 받아왔을텐데, 왜 team에서 member를 조회할 때 쿼리가 추가로 발생할까요..?

고민해봐도 모르겠어서 질문 남깁니다.

 

감사합니다.

 

답변 1

0

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

2022. 01. 12. 21:05

안녕하세요. 이원태님

일반 조인 -> 두 객체를 돌려받음, 객체 그래프가 채워지지 않은 상태로 조회됩니다.

페치 조인 -> 한 객체를 돌려받음, 객체 그래프 채워짐

감사합니다.

 

 

 

이원태님의 프로필 이미지
이원태
질문자

2022. 01. 17. 20:31

답변 감사합니다 :)

다만, 이해가 안되는 부분이 한 군데 있어 댓글로 다시 질문드립니다.

 

일반조인 시에, 객체 그래프가 채워지지 않은 상태로 조회된다면

처음 질문때의 첨부해드린 코드의 예시에서,

member(findMember) 에서 team 을 조회할 때 select 쿼리가 나가야 할 것 같은데 왜 나가지 않았을까요..

 

제가 아무래도 객체 그래프가 채워지지 않았다는 의미를 오해하고 있는 것 같은데, 의미를 알려주실수 있으실까요?

 

감사합니다

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

2022. 01. 21. 18:09

JPA에서 모든 엔티티 조회는 영속성 컨텍스트에 캐시 됩니다. (1차캐시)

처음 쿼리가 select member, team 으로 둘다 조회했기 때문에 member, team이 1차 캐시에 저장됩니다.

패치 조인을 하지 않았기 때문에 조회한 member -> team은 프록시로 조회됩니다.(지연로딩)

그런데 1차 캐시에 이미 member가 있기 때문에 이 경우는 프록시가 아닌 1차 캐시에 보관된 team이 적용됩니다.

감사합니다.

이원태님의 프로필 이미지
이원태
질문자

2022. 01. 25. 08:20

프록시 관련 내용 이해가 부족했네요 ㅠㅠ..

친절한 답변 감사합니다 :)