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

리나님의 프로필 이미지

작성한 질문수

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

조인

객체지향 쿼리 언어1 - 기본 문법 > 조인 파트에서 질문이 있습니다.

20.05.09 14:43 작성

·

159

7

05:16에서 보시면

String query = "select m from Member m inner join m.team t";

이 쿼리를 날리는데요. 

Member 엔티티 클래스에서 

###################

@ManyToOne()

@joincolum()

private Team team;

##################

"즉시 로딩"이라 할지라도

이미 

"조인한 쿼리"(member 하고 team INNER JOIN)가 나오는데 불과하고

왜 해당되는 Team에 다시 select 쿼리를 나오는건가요?

다시말씀드리자면

이미 조인해서 Member 하고 Team에 연관관계된 모든 데이터가

1차캐시에 저장되어서

Team 관련된 select 쿼리는 안오는게 아닌가요?

왜 select 쿼리가 나오는지 궁금합니다.. (제가 이전강의에 분명 놓친 부분이 있어서 질문을 드리지만 이전 영상 찾아봐도 못찾아서 ㅠ,ㅠ 어쩔수없이 ㅠ,ㅠ)

감사합니다.

답변 1

2

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

2020. 05. 09. 23:35

안녕하세요. 리나님 좋은 질문입니다^^

실무에가면 이 부분을 이해하는게, 성능에서 정말 정말 중요해집니다!

JPA는 em.find() 같은 단건 조회는 즉시 로딩으로 되어 있으면 최적화를 해서 JOIN도 하고, select 절에 team도 추가해서 SQL 한번에 조회 하지만, JPQL을 실행하는 경우는 다릅니다. JPQL은 SQL로 그대로 번역됩니다.

String query = "select m from Member m inner join m.team t";

이 JPQL을 실행한 결과를 잘 보시면, 조인한 쿼리라 할지라도 SQL의 select 절을 보시면, member 와 관련된 데이터만 DB에서 조회합니다!(SQL에서 TEAM에 대한 데이터를 조회하지 않습니다.) 그래서 최초 JPQL 실행후에 team에 대한 데이터는 없는 것이지요. 이런 문제를 해결하려면 fetch join을 학습해야 합니다.

조금 뒤에 섹션 11. 객체지향 쿼리 언어2 - 중급 문법에서 fetch join을 설명하는데요. 이 부분을 유심히 들어보시면 원하는 답을 얻을 수 있을거에요^^

감사합니다^^

리나님의 프로필 이미지

작성한 질문수

질문하기