@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?