Spring/문법

@EntityGraph - fetch join을 어노테이션으로 처리하기

가지코딩 2025. 6. 11. 11:27

@EntityGraph란?

  • JPA의 Entity Graph 기능을 Spring Data JPA에 적용한 어노테이션
  • 지연 로딩(LAZY) 필드들을 명시적으로 fetch join 하도록 설정할 수 있다.
  • JPQL의 join fetch 없이 리포지토리 메서드 수준에서 연관 엔티티를 즉시 로딩할 수 있도록 도와준다.

기본 사용법

  • attributePaths: 즉시 로딩하고 싶은 연관 엔티티 경로
  • 내부적으로 JPQL의 join fetch와 유사한 SQL이 실행됨
public interface MemberRepository extends JpaRepository<Member, Long> {

    @EntityGraph(attributePaths = {"team"})
    List<Member> findAll(); // findAll 호출 시 team도 함께 조회됨
}

예제

 

엔티티

@Entity
public class Member {
    @Id @GeneratedValue
    private Long id;

    private String name;

    @ManyToOne(fetch = FetchType.LAZY)
    private Team team;
}

 

 

일반적인 Repository 조회 (N + 1 문제 발생)

  • 메서드 호출 시 Member는 조회되지만, Team 정보 접근 시점에 추가 쿼리가 발생함 (N+1)
public interface MemberRepository extends JpaRepository<Member, Long> {
    List<Member> findAll();
}

 

 

JPQL 에서 fetch join 사용 예

  • join fetch를 사용하면 Member와 Team을 한 번의 쿼리로 조회
  • 단점: JPQL 문자열을 직접 작성해야 하므로 유지보수가 불편할 수 있음
@Query("select m from Member m join fetch m.team")
List<Member> findAllWithTeam();

 

 

@EntityGraph로 대체

  • 동일한 효과의 쿼리를 JPQL 없이도 적용 가능
  • 메서드 명 기반 쿼리 작성 시에도 연관 엔티티를 즉시 로딩(fetch join) 가능
@EntityGraph(attributePaths = {"team"})
List<Member> findAll();