본문 바로가기
web/spring

Spring JPA - 페치조인 최적화

by su0a 2024. 3. 23.

- intro - 

두번째 프로젝트를 진행하면서 특정 멤버가 쓴 모든 리뷰를 조회하는 상황이 생겼다. 

처음에는 단순히 Page<Review> findByMemberId(Long memberId, PageRequest pageRequest); 로 만들었는데 해당 로직을 실행해보니 n+1 문제가 터짐을 확인했다.

=> 인프런 김영한님의 jpa강의에서 배웠던 페치조인최적화를 사용했는데 이때 겪었던 문제에 대해 정리해보고자 한다.

 

- 정리 -

1. 페치조인은 페치조인 코드를 사용한 쿼리를 직접 만들어주어야 한다.

직접 쿼리를 지정하면 Spring Data JPA는 해당 메소드의 이름을 분석하지 않고 사용자가 제공한 JPQL 쿼리를 사용한다. 따라서 @Query 어노테이션을 사용한 경우에는 메소드의 이름을 보고 자동으로 쿼리를 만드는 Query Creation이 적용되지 않고 사용자가 지정한 JPQL 쿼리가 사용된다. 따라서 쿼리를 만들땐 함수 이름에 들어간 조건까지 모두 Query 어노테이션 내에 작성해야한다.

2. 쿼리 어노테이션을 사용해서 쿼리를 만들 땐 띄어쓰기에 주의하자

쿼리에 가독성을 높이기 위해 + 를 사용해서 쿼리를 연결해주었다. 이 때 주의해야 할점은 각 쿼리와 쿼리를 이을 때 꼭 띄어쓰기를 해주어야 한다는 것이다. 스프링부트를 실행했는데 오류가 나서 어디서 오류가 난건지 한참 헤맸다..

@Query("select r from Review r" +
    "join fetch r.member m"+
    "join fetch r.place p"+
    "where r.member.id=:id")
Page<Review> findByMemberId(@Param("id")Long memberId, PageRequest pageRequest);