본문 바로가기
JPA

스프링 데이터 JPA 페이징과 정렬

by 문자메일 2022. 5. 6.

페이징과 정렬 파라미터

  • org.springframework.data.domain.Sort : 정렬 기능
  • org.springframework.data.domain.Pageable : 페이징 기능 (내부에 Sort 포함)

 

 

특별한 반환 타입

  • org.springframework.data.domain.Page : 추가 count 쿼리 결과를 포함하는 페이징
  • org.springframework.data.domain.Slice : 추가 count 쿼리 없이 다음페이지만 확인 가능 (내부적으로 limit + 1 조회)
  • List : 추가 count 쿼리 없이 결과만 반환

 

페이징과 정렬 사용 예제

Page<Member> findByUsername(String name, Pageable pageable); //count 쿼리 사용

Slice<Member> findByUsername(String name, Pageable pageable); // count 쿼리 사용 안함

List<Member> findByUsername(String name, Pageable pageable); // count 쿼리 사용 안함

List<Member> findByUsername(String name, Sort sort);

 

위는 그냥 JpaRepository 상속받은 Repository에서 위 처럼 Querymethod로 쓰던 어떻게 하던, 그냥 정의하고 파라메터로 Pageable 인터페이스 받게 만들면 된다.

 

Repository에 반환타입을 Page<###> 로 return하면, Spring Data Jpa가 알아서 total Count도 계산해서 return 하게 되어 있다. (왜냐하면 Page 처리할 때 원래 Total Count 값을 사용하게되는 케이스가 많아서 한 번에 계산하게 구현된 것 같음)

Page 쓰면 totalCount 쿼리를 매번 호출하게 되는데, 데이터가 많아질수록 이 작업은 부담스러운 작업이다.

이 과정을 최적화 하는 방법중에 countQuery를 별도로 지정하는 방법이 있다.

이유는 countQuery를 별도로 지정하지 않으면 원본 쿼리에 join 같은 작업이 있으면 count 하는 과정에서도 불필요한 join 작업을 수행하고 count 되기 때문이다.

@Query(value = "select m from Member m left join m.team t",
        countQuery = "select count(m) from Member m")
Page<Member> findByAge(int age, Pageable pageable);

 

 

 

Slice는 Count를 안가져오기 때문에 당연히 getTotalElements(), getTotalPages() 메서드가 존재하지 않고 해당 기능을 사용할 수 없다.

 

'JPA' 카테고리의 다른 글

JPA Entity에 index 거는 방법  (0) 2022.11.26
객체지향 쿼리 언어(JPQL)  (0) 2022.09.03
순수 JPA 페이징과 정렬  (0) 2022.05.06
JPA 모델링 설계하는 순서  (0) 2022.04.09
엔티티 매핑  (0) 2022.04.09

댓글