Spring Data Paging Query 성능 최적화

이윤준·2021년 12월 13일
1

Spring

목록 보기
1/3

Spring Data는 사용해 본 사람은, 이 라이브러리 없이는 프로젝트를 진행하기 싫을 정도로 개발자가 작성해야 할 코드를 줄여주는 효자다.

그 중에서도 Pagination 관련 기능은 정말 예술작품에 가까울정도로 표준화되어 있다

Pagination이 적용되어 있는 쿼리를 작성하려면, 기존에는 DB마다 조금씩 쿼리가 달라지기도 했고, Page 관련 정보들을 저장할 객체를 만들어서 써야했다.
이 과정에서 코드가 생각보다 많이 불어나게된다.
하지만 Spring Data 아래와 같이 작성하면 끝이다.

public interface MemberRepository extends JpaRepository<Member, Long> {

    Page<Member> findByName(String name, Pageable pageable);

}

위 쿼리에서 메소드명과 Pageable 매개변수를 보고 Spring이 알아서 limit가 들어간 쿼리를 작성해준다.

하지만, 여기엔 주의할 것이 있다. Page 객체를 리턴 받으면, Spring으로 자동으로 TotalCount를 가져오는 쿼리도 작성해서 날리게된다.

간단한 쿼리는 이것이 문제되지 않는다. 하지만 쿼리가 정말 복잡해지면 이건 성능 이슈를 발생시킨다.

예시

위 코드에 join문을 넣어보자

    @Query(value = "select m from Member m left join m.team t where m.name= :name")
    Page<Member> findByName(String name, Pageable pageable);
    @Query(value = "select m from Member m left join m.team t where m.name= :name",
            countQuery = "select count(m.id) from Member m")
    Page<Member> findByName(String name, Pageable pageable);

위의 두 쿼리는 같은 결과를 리턴하지만, 성능은 다르다.
countQuery를 작성해주지 않으면, Spring Data에서 value값을 보고 자동으로 count Query를 작성한다.
위 코드의 경우는 value의 쿼리와 똑같이 left join구문이 들어간 쿼리가 작성될 것이다.

그런데 위 코드는 left join문이므로 countQuery에는 left join 구절을 넣지 않고 아래처럼 써도 똑같은 갯수를 셀 수 있다.

전체 count쿼리는 매우 무겁기 때문에, 이러한 성능 최적화는 필수적이다.

profile
욕심쟁이 개발자

0개의 댓글