페치 조인은 SQL에서 제공하는 기능은 아닙니다.
SQL조인을 활용해서 연관된 엔티티를 SQL 한번에 조회하는 기능입니다.
주로 성능 최적화에 사용하는 방법입니다.
@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();
}
@PersistenceUnit
EntityManagerFactory 를 인젝션하기 위한 어노테이션
getPersistenceUnitUtil().isLoaded()
as()
실행하고 쿼리를 확인해봅시다.
member 엔티티만 가져온 것을 알 수 있습니다. 그래서 getPersistenceUnitUtil().isLoaded() 의 값이 false 로 테스트 코드도 성공하는 것이죠.