Springboot

쿼리 매소드 fetch 조인 적용

25G 2023. 8. 17. 19:22

Fetch join?

패치 조인은 영속성 관리대상인 엔티티 객체를 호출할때 해당 엔티티객체가 관계맺고 있는 대상까지 다 조회를 한다. 이때 예를 들어 아래와 같이 조회를 한다고 가정해 보자

select m from member m 

위와 같은 쿼리를 jpql로 날렸을때 실제로 하이버네이트에서 보내는 쿼리는 member 내부에 관계를 맺고있는 다른 엔티티를 조회하는 쿼리까지 함께 보낸다

연관관계를 맺고 있는 엔티티까지 다 들고오는건 orm의 강점 이긴하나 이때 발생하는 문제가 바로 연관관계를 맺고 있는 엔티티의 수만큼 select 쿼리가 나가는 것이다.
그말은 즉 io가 많아진다는 것이고 때에따라선 성능저하의 원인이 될 수도 있다.
이를 해결하는 방법중 하나가 fetch 조인이다.

JPQL fetch join

@Query("select m from Member m join fetch m.team")
List<Member> findMemberFetchJoin();

쿼리메소드 fetch 조인 적용

@EntityGraph(attributePaths = {"team"})
List<Member> findEntityGraphByUsername(@Param("username") String username);

attributePaths에 값으로 연관관계를 맺고있는 엔티티에 필드명을 넣어준다.

위 방법 외에 방법들

  • nativeQuery를 사용한다.
  • projection을 사용한다.