• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

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

22.01.10 14:30 작성 조회수 225

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.17

답변 감사합니다 :)

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

 

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

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

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

 

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

 

감사합니다

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

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

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

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

감사합니다.

이원태님의 프로필

이원태

질문자

2022.01.25

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

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