[JPA] 엔티티그래프

김형진·2023년 6월 20일
0

Jpa사용 시 일반적으로 참조객체는 전부 LAZY 로딩으로 설정한다.

그러나 실제 쿼리의 경우 fetch join이 필요한 경우가 많은데, 이를 위해 생성되는 쿼리에 중복이 발생하거나 fetch join이 필요한 경우 매번 쿼리를 직접 작성해야 하는 번거로움이 있다.

이런 경우를 위해 JPA에서는 엔티티 그래프라는 기능을 제공하는데, join쿼리를 직접 작성하지 않아도 참조 객체를 끌어오는 기능이다.

JPQL사용 예시 (정적 엔티티 그래프)

@Entity
@NamedEntityGraph(name = "Member.withTeam",
        attributeNodes = @NamedAttributeNode("team"))
public class Member {
    // ...
    @ManyToOne(fetch = FetchType.LAZY)
    private Team team;
    // ...
}
EntityGraph graph = em.createEntityGraph("Member.withTeam");
List<Member> members = em.createQuery("select m from Member m", Member.class)
                          .setHint("javax.persistence.fetchgraph", graph)
                          .getResultList();

엔티티에 NamedEntityGraph를 정의하고 (여러 개 정의 가능) query이전 정적 엔티티 그래프의 이름을 넘겨받은 graph객체를 생성하여 query시 hint로 graph객체를 넘겨준다.
엔티티매니저는 넘겨받은 graph를 토대로 fetch join을 해줄 것이다.

JPQL (동적 엔티티 그래프)

EntityGraph<Member> graph = em.createEntityGraph(Member.class);

graph.addAttributeNodes("team");

List<Member> members = em.createQuery("select m from Member m", Member.class)
                          .setHint("javax.persistence.fetchgraph", graph)
                          .getResultList();

NamedEntityGraph를 정의하지 않고 graph객체를 먼저 생성 후 참조하고자 하는 필드를 입력해주는 것만으로도 동적 엔티티 그래프를 사용하여 fetch join할 수 있다.

Spring Data JPA (동적 엔티티 그래프)

public interface MemberRepository extends JpaRepository<Member, Long>{
    @EntityGraph(attributePaths = {"team"})
    List<Member> findAll();
}
profile
히히

0개의 댓글