[Spring Data JPA] @EntityGraph 엔티티 그래프란?

Spring Data JPA는 JPA가 제공하는 엔티티 그래프 기능을 편리하게 사용하게 도와주는데, 이 기능이 바로 @EntityGraph이다.

JPQL로 fetch join을 직접 작성하지 않고 @EntityGraph 어노테이션을 붙임으로서 fetch join을 편리하게 사용할 수 있다.

즉, @EntityGraph는 fetch join을 적용해주기 때문에 N + 1 문제를 해결하고, 성능 최적화에 도움을 줄 수 있다. (fetch join의 간편 버전)

 

fetch join 이란? => 2023.06.12 - [JAVA/JPA] - [JPA] JPQL의 fetch join(패치 조인)이란?


사용 방법

Member와 Team 엔티티가 있고 이 둘은 "1 : 다" 양방향 관계를 갖는다고 가정해보자.

이 때 Member를 조회할 때 Team도 같이 조회하고 싶다면 다음과 같이 Repository의 메서드@EntityGraph를 붙여 fetch join을 적용할 수 있다.

// ("select m from Member m left join fetch m.team" 쿼리와 똑같은 결과)
@Override
@EntityGraph(attributePaths = {"team"}) // 옵션 : 연관된 엔티티 지정
List<Member> findAll();

 

해당 메서드를 실행 해보면 fetch join이 적용되어 한번의 select 쿼리로 member와 team을 조회해 온것을 볼 수 있다.

select
    m1_0.member_id,
    m1_0.age,
    t1_0.team_id,
    t1_0.name,
    m1_0.username 
from
    member m1_0 
left join
    team t1_0 
        on t1_0.team_id=m1_0.team_id

이렇게 @EntityGraph를 사용하면 fetch join을 직접 작성하지 않아도 쉽게 적용할 수 있다.

 

 

이 외에도 @EntityGraph를 활용하는 방법에 대해 알아보자.

@EntityGraph를 JPQL과 함께 사용하는 방법
@Query("select m from Member m")
@EntityGraph(attributePaths = {"team"})
List<Member> findMemberEntityGraph();

 

메소드 이름으로 작성한 쿼리와 함께 사용
@EntityGraph(attributePaths = {"team"}) // 메서드이름 쿼리에도 EntityGraph 적용 가능
List<Member> findEntityGraphByUsername(@Param("username") String username);

 


주의 할 점

@EntityGraph는 left outer join 만을 지원한다.

그렇기 때문에 다른 방식이 필요하면 JPQL을 직접 작성해 fetch join을 사용해야 한다.