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

리나님의 프로필 이미지
리나

작성한 질문수

실전! 스프링 데이터 JPA

JPQL로 join select를 했을떄 fetch = FetchType.LAZY로 적용했는데도 불과하고

작성

·

446

0

JPQL로 join select를 했을떄 fetch = FetchType.LAZY로 적용했는데도 불과하고 

쿼리문을 보면 inner join을 해서 나오는데요

무슨말이면

@Query("select new study.datajpa.dto.MemberDto(m.id, m.username, t.name) from Member m join m.team t")

이 단락을 보면 패치조인이 아니라 일반적인 조인을 했을경우 sql 중심으로 select 하는게 아니라

entity 중심으로 select 하기 때문에

이렇게 Member 연관관계를 맺은 Team이 지연로딩으로 셋팅했기 때문에

n + 1 로 member select 하고

연관관계인 team을 select 해야되지 않나요?

로그 보면 query문이 inner join으로 되어 있어서요...

이게 해당 비지니스 로직인데요

그럼 디버깅 체크 되기 전 save 했을때

이미 1차 캐시에 저장이 되어서(선배님의 JPA 기본편 보니 이렇게 되어 있어서요.. 혹시 제가 잘못 알고있었나요? )

inner join 으로 나가게 되는건가요?

어 그럼... DB에 커넥션 해서 가져오는게 아니라서 query문이 안나와야 하는데..

혼동되네요 ㅠ,ㅠ

이상으로 좋은 강의를 만들어주셔서 감사드리고 잘 부탁드립니다!

감사합니다.

답변 1

0

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

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

em.find 처럼 JPQL을 작성하지 않고, 엔티티 하나를 직접 찾는 명령어와 JPQL을 통해 조회하는 경우에 차이를 이해하면 궁금해하는 부분이 해결되실꺼에요^^

1. JPQL은 작성된 JPQL을 그대로 SQL로 번역합니다. 엔티티에서 연관관계가 LAZY로 되었든, EAGER로 되어있든간에 JPQL 자체를 SQL로 변경해서 실행할 때는, 이런 옵션들에 영향을 받지 않습니다.

em.find()처럼 엔티티 하나를 직접 찍어서 조회할 때는 JPQL을 개발자가 직접 작성하지 않는데, 이경우는 영향을 줍니다.

2. 추가로 JPQL은 1차 캐시와 무관하게 항상 SQL로 변경되어서 실행됩니다.

반면에 em.find()나, 지연로딩된 엔티티를 찾을 때는 1차 캐시를 먼저 확인합니다.

감사합니다^^

리나님의 프로필 이미지
리나

작성한 질문수

질문하기