Querydsl - 페치 조인
인프런 실전! Querydsl 강의 내용 정리
페치 조인은 SQL에서 제공하는 기능은 아니다. SQL조인을 활용해서 연관된 엔티티를 SQL 한 번에 조회하는 기능이다. 주로 성능 최적화에 사용하는 방법이다.
페치 조인 미 적용 지연 로딩으로 Member, Team SQL 쿼리 각각 실행
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Test
public void fetchJoinNo() throws Exception {
//given
em.flush();
em.clear();
//when
Member findMember = queryFactory
.selectFrom(member)
.where(member.username.eq("member1"))
.fetchOne();
//then
System.out.println(findMember.getTeam().getName());
}
다음과 같은 테스트 일 시, 우리는 N+1이 일어날 것이라고 지금까지 배워온 결과로 직감 할 수 있다.

멤버 쿼리, 팀 쿼리 2 번 나온 걸 볼 수 있다.
이제 fetchJoin을 써야 한다는 것도 다들 알 것이다.
그 전에 엔티티에 정보가 가져와 져있는지, 프록시 인지 테스트 할 방법을 알아보자.
1
2
@PersistenceUnit
EntityManagerFactory emf;
먼저 필드 영역에 엔티티 매니저 팩토리를 만들고
1
boolean loaded = emf.getPersistenceUnitUtil().isLoaded(findMember.getTeam());
getPersistenceUnitUtil().isLoaded(엔티티.get찾을거()) 해주면
이게 지금 진짜면 true, 아니면 false를 주게 된다.
그래서 다음과 같이 작성할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Test
public void fetchJoinNo() throws Exception {
//given
em.flush();
em.clear();
//when
Member findMember = queryFactory
.selectFrom(member)
.where(member.username.eq("member1"))
.fetchOne();
boolean loaded = emf.getPersistenceUnitUtil().isLoaded(findMember.getTeam());
//then
assertThat(loaded).as("페치 조인 미적용").isFalse();
}
그럼 이제 Querydsl에서 페치 조인 적용하는 방법을 알아보자.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Test
public void fetchJoin() throws Exception {
//given
em.flush();
em.clear();
//when
Member findMember = queryFactory
.selectFrom(member)
.join(member.team, team).fetchJoin()
.where(member.username.eq("member1"))
.fetchOne();
boolean loaded = emf.getPersistenceUnitUtil().isLoaded(findMember.getTeam());
//then
assertThat(loaded).as("페치 조인 적용").isTrue();
}
이게 끝이다. join(member.team, team) 이거는 전편 조인 on 절 에서 썼던 거랑 같이 inner join을 해준 거고
이제 추가적으로 그 뒤에 .fetchJoin() 이 붙는다. 정말 간단하다;;

보면 원하는 대로 쿼리가 한 번 나가고, team에 대한 정보도 가져온다.
댓글남기기