작성
·
342
2
안녕하세요, 강의 잘 듣고 있습니다.
(아래 내용은 @ManyToOne의 default 설정 값인 fetch가 EAGER일 때 입니다...)
해당 영상 5분 7초 때의 콘솔을 보면,
Team 조회 쿼리가 추가로 한 번 더 발생되고 있습니다.
하지만 jpql쿼리를 보면,
"select m from Member m inner join m.team t"
즉 Member 엔티티와 연관된 Team 엔티티를 inner join 하여 같이 한 번에 가져오는 쿼리입니다.
"select m from Member m" 이라고 jpql을 작성했으면 당연히 연관된 Team 엔티티를 조회하는 select 쿼리가 별도로 실행되는 게 맞지만, inner join으로 작성했기 때문에 별도의 Team 엔티티를 조회하기 위한 select 쿼리가 발생할 필요가 없는 것 같은데, 추가로 select 쿼리가 발생하는 부분이 잘 이해가 되지 않습니다.
답변 미리 감사드립니다.
답변 2
3
안녕하세요. runwithyou123님
다음을 참고해주세요.
https://www.inflearn.com/questions/33719
https://www.inflearn.com/questions/39516
감사합니다.
0
안녕하세요 김영한님!
저도 이와 같은 질문이 있었는데요. 댓글로 알려주신 링크를 참고해서 봐도 이해가 100프로 되지 않아서 질문을 추가해서 이곳에 드리게 되었습니다.
(Member의 ManyToOne으로 연결된 team 필드는 default인 EAGER로 되어있는 상태입니다.)
select m from Member m inner join m.team t
이렇게 JPQL로 createQuery 실행하면 inner join으로 쿼리 실행하게 되고 projection으로 member 내용만 가져오게 되는데요.
team에 대한 select 절이 한 번더 실행되는 이유가 projection으로 Member entity 내용을 가져오는데 team필드가 EAGER
이기에 inner join 쿼리로 team 연결해서 조회했던 것과 별개로 select team 쿼리가 추가로 나가게 되는 것인가요??
제가 이해한 것이 맞는지 궁금합니다!~
안녕하세요, 제가 이해한 대로 답글을 한 번 달아보겠습니다.
우리가 JPQL로 작성한 쿼리는 단순히 데이터베이스가 이해할 수 있는 SQL로 변환되어 실행됩니다.
JPQL로 작성된
SELECT m FROM Member m INNER JOIN m.team t
는이렇게 해석되어 실행될 것입니다. 그래서 DB에 저장된 Member 행(row)를 갖고와서 Entity(객체)로 변환 작업을 합니다.
Entity로 변환 작업을 끝마치고 Member 엔티티 설정을 확인하니 이럴수가(?) @ManyToOne의 fetch = EAGER 설정으로 자신이 참조하고 있는 Team 엔티티를 즉시 가져와야 합니다.
그래서 Member 엔티티에 저장된 Team 엔티티의 PK를 참조하여 (Member 엔티티 입장에서는 FK겠죠?) 데이터베이스에 쿼리를 날려야 합니다.
그래서
SELECT t.* FROM Team t where t.id = ?
위와 같은 쿼리가 Member 엔티티의 조회 결과 개수만큼 발생됩니다. (만약 여러 개의 Member 엔티티가 동일한 Team PK를 참조하고 있다면 한 번의 추가 쿼리만 발생되겠네요)
여기까지가 제가 이해한 내용입니다. 조금이라도 도움이 되셨으면 좋겠습니다..