JPA/Spring Data JPA

[SpringDataJPA] @EntityGraph

IT록흐 2023. 7. 13. 21:35
반응형

 

JPA는 연관된 엔티티를 두 가지 전략으로 로딩한다. 

 

1. LAZY 전략

2. EAGER 전략

 

LAZY 전략은 한 엔티티를 메모리에 로딩할 때, 연관된 엔티티 로딩은 지연시키는 것이다. 그리고 연관된 엔티티가 호출될 때, 그때 쿼리를 날려 DB에서 로딩하는 전략이다. 

 

EAGER 전략은 한 엔티티를 메모리에 로딩할 때, 연관된 엔티티도 같이 메모리에 로딩하는 전략이다. 

 

그런데 두 가지 전략에는 문제가 있다. 연관된 엔티티를 로딩하기 위해 추가적인 쿼리문이 수행되어야 한다. 쿼리문이 반복 수행되면 성능에 좋지 못하다. JPA는 이 문제를 해결하기 위해 '페치 조인'을 제공한다. 

 

 

[JPA] 페치 조인 ( JOIN FETCH )

엔티티의 연관 엔티티를 로드하는 전략은 두 가지가 있다. 1. 지연로딩 ( Lazy ) 2. 즉시로딩 ( Eager ) 그러나 두 가지 전략은 문제가 있다. 즉시로딩은 연관된 엔티티를 로드하려고 SELECT문이 자동으

lordofkangs.tistory.com

 

 

페치 조인에 대해서는 위 포스팅을 참고하면 된다.

그럼 SpringDataJPA는 페치 조인을 어떻게 제공하고 있을까?

 

 

@EntityGraph

 

 

[SpringDataJPA] 메소드 이름으로 쿼리생성하기

[JPA] SpringDataJPA란? Spring Data란? Spring Data란, Spring 프레임워크가 제공하는 추상화된 데이터 접근 기술이다. 데이터베이스나 ORM프레임워크의 종류에 따라 데이터접근방식은 다양하게 구현되지만...

lordofkangs.tistory.com

 

SpringDataJPA는 개발자가 리포지토리 인터페이스에 메소드를 만들면 메소드이름을 파싱하여 쿼리를 자동생성한다. 그러나 페치 조인은 메소드 이름으로 자동생성되지 않는다. 그러면 개발자가 직접 JPQL로 페치 조인을 구현해야 할까? 아니다. SpringDataJPA는 페치 조인을 자동생성하는 어노테이션을 제공한다. 그것이 @EntityGraph이다. 

 

public interface MemberRepository extends JpaRepository<Member,Long> {
    @EntityGraph(attributePaths = {"team"})
    List<Member> findEntityGraphByUsername(@Param("username") String username);
}

 

페치 조인할 메소드 위에 @EntityGraph를 선언한다. 연관된 엔티티는 attributePaths에 설정하면 된다. 만약 연관된 엔티티가 많아 설정이 복잡하고 재사용이 가능하도록 만들고 싶다면, 엔티티에 @NamedEntityGraph로 설정하고 이를 Name으로 가져올 수도 있다.

 

Member 엔티티

@NamedEntityGraph(name = "Member.all",attributeNodes = @NamedAttributeNode("team"))
public class Member {

	@Id @GeneratedValue
    @Column(name ="member_id")
    private Long id;
    
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="team_id")
    private Team team;

}

 

Member 리포지토리

public interface MemberRepository extends JpaRepository<Member,Long> {
    @EntityGraph("Member.all") 
    List<Member> findEntityGraphByUsername(@Param("username") String username);
}

 

 

이렇듯, 엔티티에 @NamedEntityGraph로 설정된 엔티티그래프를 리포지토리에서 이름으로 검색하여 가져올 수 있다.

 

@EntityGraph는 단순한 페치조인을 구현할 때 좋다.

 

페치 조인할 연관된 엔티티가 많아지면 설정도 많아져 오히려 가독성이 떨어질 수 있다. 그러므로 복잡한 페치 조인을 구현해야 한다면 @Query 어노테이션에 JPQL로 직접 구현하는 것이 좋다. 단순한 페치조인이면 @EntityGraph 어노테이션으로 구현하면 된다. 

 

 

 


 

 

참고자료

 

실전! 스프링 데이터 JPA - 인프런 | 강의

스프링 데이터 JPA는 기존의 한계를 넘어 마치 마법처럼 리포지토리에 구현 클래스 없이 인터페이스만으로 개발을 완료할 수 있습니다. 그리고 반복 개발해온 기본 CRUD 기능도 모두 제공합니다.

www.inflearn.com

 

반응형