QueryDsl 페치조인 미적용 테스트 중 결과가
member.getTeam() 조회했을때 Lazy 타입으로 지연로딩이 되어 false가 나와야 하는데 true 가 나와 테스트 실패 했다.
@PersistenceUnit
EntityManagerFactory emf;
@Test
@DisplayName("페치조인 미적용")
void fetchJoin_no(){
Member member1 = jpaQueryFactory.selectFrom(member)
.where(member.username.eq("member1"))
.fetchOne();
boolean loaded1 = emf.getPersistenceUnitUtil().isLoaded(member1.getTeam());
assertThat(loaded1).as("페치조인 미적용").isFalse();
}
}
영속성 컨텍스트에 혹시 모를 남아 있을 데이터에 의해서 true를 반환 했다.
em.flush();
em.clear();
정리하면, flush() 및 clear()를 적용하면 영속성 컨텍스트를 초기화하고, 다시 로딩되어야 할 연관 객체를 초기화된 상태로 가져올 수 있습니다. 따라서 loaded1 값이 false가 되는 것으로 예상한 대로 동작하게 됩니다.
@PersistenceUnit
EntityManagerFactory emf;
@Test
@DisplayName("페치조인 미적용")
void fetchJoin_no(){
em.flush();
em.clear();
Member member1 = jpaQueryFactory.selectFrom(member)
.where(member.username.eq("member1"))
.fetchOne();
boolean loaded1 = emf.getPersistenceUnitUtil().isLoaded(member1.getTeam());
assertThat(loaded1).as("페치조인 미적용").isFalse();
}
}