fetch join을 SpringDataJPA에서는 @EntityGraph 어노테이션을 통해 간단하게 할 수 있다.
// 한방쿼리로 들고 오는 fetch join
@Query("select m from Member m left join fetch m.team")
List<Member> findMemberFetchJoin();
위의 fetch join 메서드를 EntityGraph를 사용하면 아래와 같이 바꿀 수 있다.
EntityGraph를 이용하면 메서드 이름으로 쿼리 생성 + 패치조인처럼 쓸 수 있음
@Override
@EntityGraph(attributePaths = {"team"})
List<Member> findAll();
jpql 대신 @EntityGraph 어노테이션을 사용한다.
attributePaths에 fetch join할 필드 이름을 작성해준다.
엔티티그래프는 fetchType을 Eager로 변환하는 방식으로 left outer join을 수행한다.
fetch join은 기본적으로 inner join을 수행한다.
(EntityGraph를 이용하면 1:N 컬렉션 join 시 하나만 join할 수 있는 단점을 피할 수 있다. 대신 paging은 하지말 것. 메모리 관련 장애 발생가능)
이렇게 간단간단한거는 @EntityGraph를 사용하고, 복잡한 쿼리는 jpql 사용하는 것을 추천한다.
아래와 같이 응용할 수 있다.
jpql 쿼리에 fetch join 추가하기
//쿼리 짯는데 fetch join 추가 하기 가능함
@EntityGraph(attributePaths = {"team"})
@Query("select m from Member m")
List<Member> findMemberEntityGraph();
메소드 이름으로 만든 쿼리에 fetchjoin 적용하기
//메소드 이름으로 짓기 가능 (find..(아무이름)By...)
//@EntityGraph(attributePaths = {"team"})
List<Member> findEntityGraphByUsername(@Param("username") String username);
예전에 프로젝트 한다고 유저 권한(authority)을 가져오는 걸 fetch join으로 만들어 본 적이 있는데,
EntityGraph를 이용해서 수정해볼까?
@Query("select u from User u join fetch u.authorities a where u.email = :email")
public Optional<User> findByEmail(@Param("email") String email);
아래와 같이 수정해보았다.
@EntityGraph(attributePaths = {"authorities"})
Optional<User> findByEmail(@Param("email")String email);
'Java > JPA' 카테고리의 다른 글
H2 Database 사용법 (0) | 2024.05.13 |
---|---|
SpringDataJPA - 벌크성 수정 쿼리 (0) | 2024.01.10 |
SpringDataJPA - 페이징을 쉽게 하는 법 (0) | 2024.01.10 |
SpringDataJPA - 메서드 및 유연한 반환타입 (0) | 2024.01.09 |
JPA실전 2 - OSIV와 성능 (0) | 2023.12.12 |