페치 조인

페치 조인은 SQL에서 제공하는 기능은 아닙니다.

SQL조인을 활용해서 연관된 엔티티를 SQL 한번에 조회하는 기능입니다.

주로 성능 최적화에 사용하는 방법입니다.

JPQL 페치 조인 자세히

페치 조인 미적용

@BeforeEach
void setUp() {
    queryFactory = new JPAQueryFactory(em);

    Team teamA = new Team("teamA");
    Team teamB = new Team("teamB");
    em.persist(teamA);
    em.persist(teamB);

    Member member1 = new Member("member1", 10, teamA);
    Member member2 = new Member("member2", 20, teamA);
    Member member3 = new Member("member3", 30, teamB);
    Member member4 = new Member("member4", 40, teamB);
    em.persist(member1);
    em.persist(member2);
    em.persist(member3);
    em.persist(member4);
}

@DisplayName("페치 조인 미적용")
@Test
public void fetchJoinNo() throws Exception {
    em.flush();
    em.clear();

    Member findMember = queryFactory
            .selectFrom(member)
            .where(member.username.eq("member1"))
            .fetchOne();

    boolean loaded = emf.getPersistenceUnitUtil().isLoaded(findMember.getTeam());
    assertThat(loaded).as("페치 조인 미적용").isFalse();
}
  1. flush()clear()

  2. @PersistenceUnit

  3. getPersistenceUnitUtil().isLoaded()

  4. as()

실행하고 쿼리를 확인해봅시다.

Untitled

member 엔티티만 가져온 것을 알 수 있습니다. 그래서 getPersistenceUnitUtil().isLoaded() 의 값이 false 로 테스트 코드도 성공하는 것이죠.

페치 조인 적용