@EntityGraph
N + 1 문제
@SpringBootTest
@Transactional
@Rollback(value = false)
class MemberRepositoryTest {
@Test
void findMemberLazy() {
Team teamA = new Team("teamA");
Team teamB = new Team("teamB");
teamRepository.save(teamA);
teamRepository.save(teamB);
memberRepository.save(new Member("member1", 10, teamA));
memberRepository.save(new Member("member2", 20, teamB));
em.flush();
em.clear();
List<Member> members = memberRepository.findAll();
for (Member member : members) {
member.getTeam().getName();
}
}
}fetch 방식이 Lazy면 결과 개수에 따라 쿼리가 더 나간다.
네트워크를 그만큼 타는 것이기 때문에 성능 저하가 발생한다.
fetch join
fetch join을 명시해서 조회하면 프록시 없이 한 번에 값을 다 채워서 가져온다.
그런데 스프링 데이터 JPA는 자동으로 제공되는 메서드도 있어서 fetch join을 적용하기가 번거롭다.
@EntityGraph
fetch join을 편하게 적용할 수 있다.
left outer join을 사용한다.
기본으로 제공되는 메서드에도 적용할 수 있다.
@NamedEntityGraph
NamedQuery를 활용해서 fetch join 할 수도 있다.
활용
보통 직접 @Query에 JPQL로 fetch join을 넣어서 사용한다.
너무 간단해서 쓰기 귀찮으면 @EntityGraph를 쓴다.
Last updated
Was this helpful?