DEV/Spring Data JPA

Join과 Pagination 함께 사용할 때 Count 쿼리 최적화

행운개발자 2023. 9. 24. 11:46
728x90

JOIN을 해서 pagination까지 제공해야하는 경우가 있습니다.

@Repository
public interface MemberJpaRepository extends JpaRepository<Member, Long> {
    @Query(value = "select m from Member m left join m.team t where t.id = :teamId")
    Page<Member> findPageByName(String name, Pageable pageable);
}

그런데 이 때 JOIN을 사용하는 COUNT 쿼리가 발생할 수 있습니다.

 

select count(m) from Member m left join m.team t

left outer join은 COUNT 결과 갯수에 영향을 주지 않음에도, 이미 충분히 무거운 count 쿼리의 성능을 저하시킬 수 있습니다.

 

이럴 때에는 데이터 조회 query와 Count 조회 query를 분리하는 방법을 사용해야합니다.

spring-data-jpa에서는 @Query에서 countQuery를 별도로 지정할 수 있는 방법을 제공합니다.

@Repository
public interface MemberJpaRepository extends JpaRepository<Member, Long> {
    @Query(value = "select m from Member m left join m.team t where t.id = :teamId",
            countQuery = "select count(m) from Member m")
    Page<Member> findPageByName(String name, Pageable pageable);
}
728x90