inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

실전! Querydsl

조인 - 페치 조인

fetch join vs join

해결된 질문

1176

asdkfur

작성한 질문수 22

3

안녕하세요 선생님 오랫만에 질문 다시 올립니다.이번강의도 정말 잘 듣고 있습니다. 아래와 같이 2가지의 다른 방식으로  queyrdsl를 사용하면  나가는 쿼리는 동일합니다.

하지만  jpa 에서 처리하는 방식이 다른거죠?  fetch join을 사용하면 LAZY까지  초기화 해서 한 객체를 만들어주고 다른 방식은 그냥 다른 두 객체로써 가지고 오는거죠?

  Member findMember = queryFactory

                .selectFrom(member)

                .join(member.team,team).fetchJoin()

                .where(member.username.eq("member1"))

                .fetchOne();

  Tuple findMember2 = queryFactory

                .select(member,team)

                .from(member)

                .join(member.team,team)

                .where(member.username.eq("member1"))

                .fetchOne();

 select

            member0_.member_id as member_i1_1_0_,

            team1_.team_id as team_id1_2_1_,

            member0_.age as age2_1_0_,

            member0_.team_id as team_id4_1_0_,

            member0_.username as username3_1_0_,

            team1_.name as name2_2_1_ 

        from

            member member0_ 

        inner join

            team team1_ 

                on member0_.team_id=team1_.team_id 

        where

            member0_.username=?

select

            member0_.member_id as member_i1_1_0_,

            team1_.team_id as team_id1_2_1_,

            member0_.age as age2_1_0_,

            member0_.team_id as team_id4_1_0_,

            member0_.username as username3_1_0_,

            team1_.name as name2_2_1_ 

        from

            member member0_ 

        inner join

            team team1_ 

                on member0_.team_id=team1_.team_id 

        where

            member0_.username=?

JPA java

답변 2

9

김영한

안녕하세요. asdkfur님 오랜만입니다^^

fetch join이라는 기능 자체의 핵심은 연관된 엔티티를 한번에 최적화해서 조회하는 기능입니다. 그래서 LAZY가 발생하지 않습니다.

1. findMember.getTeam().getName() -> LAZY 쿼리 발생X

반면에 2번은 LAZY 상태를 유지하고 조회하기 때문에 LAZY 쿼리가 발생할 수 있습니다.

2. findMember2.getTeam().getName() -> LAZY 쿼리 발생O

그런데! 아마 실행해보시면 2번에서 LAZY 쿼리가 발생하지 않을꺼에요^^ 왜냐하면 2번에서 team을 결국 찾아야 하는데, JPA에서 LAZY 동작방식은 먼저 영속성 컨텍스트에 있는 team을 찾고 그래도 없으면 db에서 team을 찾게 됩니다. 그런데 2번에서 이미 team도 함께 select 절에서 찾아왔기 때문에 team이 영속성 컨텍스트에 존재하고, 따라서 쿼리 없이 함께 조회가 될꺼에요.

이번 예제가 좀 특수한 경우고, 일반적으로 team이 영속성 컨텍스트에 미리 존재하는 경우는 드물기 때문에, 대부분은 LAZY 호출시에 추가 쿼리가 발생합니다.

감사합니다.

3

asdkfur

감사합니다 ! 

SpringBoot 4.X에서의 Querydsl 설정

0

91

2

querydsl 오픈소스에 대한 질문

0

72

1

예제에서의 카운트 쿼리에서 join문과 where문은 필요없지 않나요?

0

109

1

Querydsl 6.X버전에 대해서 어떻게 생각하시나요?

0

318

2

여러 테이블 조인하여 통계치를 구하고자 할 때 어떤 방법이 더 효율적일까요

1

71

1

fetchResults()는 더이상 권장되지 않는다는데 맞나요?

0

160

1

querydsl sum() 메서드 없어요.

0

160

2

build 디렉터리 생성

0

140

2

자바 ORM 표준 JPA 프로그래밍 - 기본편 듣고 바로 학습해도 괜찮을까요?

0

114

2

현재 Querydsl에서 from절 서브쿼리를 지원하나요?

0

92

1

오타 제보 드립니다.

0

73

2

벌크 연산과 flush, clear

0

76

1

Run As Intellij 로 변경시 Q타입 import 불가

0

88

1

QHello import하기 문제 발생

0

147

2

등록된 함수 보는법(H2Dialect) 질문

0

68

2

5.0부터 Querydsl은 향후 fetchCount() , fetchResult() 를 지원하지 않기로 결정했다고 하는데 이에 맞는 강의

1

199

2

[환경설정 PDF 부트 3.0이후 설명 질문] build.gradle에 compileQuerydsl을 정의하지 않은 상태에서 Gradle->Tasks->other->compileQuerydsl을 클릭하라고 하는 이유가 무엇인가요??

1

201

1

querydsl 설정 문제

0

222

2

quey dsl 설정부분

0

158

2

count 쿼리 관련 질문입니다!

0

75

1

stringtemplate를 이용하여 where절 검색 방법 질문 드립니다.

0

89

1

답변부탁드리겠습니다.

0

90

2

(OrderSpecifier)관련 내용 어디있을가요

0

66

1

중급문법 벌크연산에서

0

83

2