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을 사용해야 한다.
'◼ JPA' 카테고리의 다른 글
[Spring Data JPA] 스프링 데이터 JPA에서 페이징(Paging) 사용하기 (2) | 2023.06.26 |
---|---|
[JPA] 페이징과 정렬에 대해 알아보자. (0) | 2023.06.20 |
[Spring Data JPA] 쿼리 생성 기능과 반환 타입 (0) | 2023.06.20 |
[JPA] 컬렉션 조회 시 주의할 점 (hibernate.default_batch_fetch_size) (0) | 2023.06.20 |
JpaRepository를 상속한 인터페이스가 구현체가 없이 동작하는 이유 (0) | 2023.06.19 |