1 분 소요

인프런 실전! 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에 대한 정보도 가져온다.

태그: ,

카테고리:

업데이트:

댓글남기기