-
@EntityGraph - 어노테이션으로 fetch joinJPA/스프링 데이터 JPA 2023. 8. 12. 00:04
JPA 사용 시 N + 1 문제를 해결해주는 기능이다.
N + 1 문제를 해결하기 위해 fetch join이 중요하다는 것은 여러번 강조했었다.
@EntityGraph는 쉽게 말해 fetch join을 쉽게 해주는 기능이다.
스프링 데이터 JPA는 쿼리를 최소한으로 작성하는데 fetch join을 하기 위해서는 무조건 JPQL을 작성해야하기 때문에 메서드 이름과 어노테이션으로 fetch join 최적화를 하기 위한 기능이 @EntityGraph이다.
public interface MemberRepository extends JpaRepository<Member, Long> { @Override // findAll()은 상속받은 상위 인터페이스에 있으므로 오버라이드 @EntityGraph(attributePaths = {"team"}) // team까지 fetch join 해주는 것 List<Member> findAll(); }
인터페이스의 메서드에 @EntityGraph(attributesPaths = {"join할 테이블"})을 넣어주면 자동으로 fetch join을 해준다.
@EntityGraph(attributePaths = {"team"}) @Query("select m from Member m") List<Member> findMemberEntityGraph(); // 쿼리에다가도 @EntityGraph 가능 @EntityGraph(attributePaths = {"team"}) List<Member> findEntityGraphByUsername(@Param("username") String username); // 메서드로 인한 자동 쿼리에도 @EntityGraph 가능
스프링 데이터 JPA에서 제공하는 @EntityGraph를 사용하면 fetch join을 쉽게 해서 쿼리 최적화를 쉽게 적용할 수 있다는 장점이 있다.
@EntityGraph를 사용하거나 아니면 너무 복잡한 쿼리면 JPQL을 직접 짜야 하므로 fetch join을 사용해야 한다.
둘을 잘 섞어가면서 필요할 때 사용하는 게 낫다.
'JPA > 스프링 데이터 JPA' 카테고리의 다른 글
스프링 데이터 JPA에서의 사용자 정의 리포지토리 (0) 2023.08.12 JPA Hint (0) 2023.08.12 벌크성 수정 쿼리 (0) 2023.08.11 스프링 데이터 JPA의 페이징과 정렬 (0) 2023.08.11 @Query - 쿼리 정의하기 (0) 2023.08.11