[Spring] JPA paging, sorting 처리

devyu·2021년 3월 18일
3

스프링 데이터 JPA를 통한 paging, sorting

스프링 데이터 JPA는 페이징과 정렬을 쉽게 구현하도록 PageSlice 두 가지 인터페이스를 제공한다.

Page 인터페이스

// service
PageRequest pageRequest = PageRequest.of(조회 페이지, 조회 데이터의 수, Sort.Direction.DESC, 정렬 필드명);
Page<Member> members = memberRepository.findByAge(age, pageRequest);
// repository
public interface MemberRepository extends JpaRepository<Member, Long> {
    // paging 처리(반환타입 Page인터페이스)
    Page<Member> findByAge(int age, Pageable pageable);
}
  • Pageable 인터페이스를 구현한 PageRequest 객체를 사용한다. 첫 번째 파라미터에는 현재 페이지(0 부터 시작함)를 두 번째 파라미터에는 조회할 데이터의 수를 적으면 된다.
  • PageRequest 객체는 필요하다면 sorting 기능을 제공하므로 세 번째 파라미터에 정렬 방향성을, 네 번째 파라미터에는 정렬 기준이 되는 field를 설정할 수 있다.
  • Page 인터페이스로 반환을 받으면 스프링 데이터 JPA는 내부적으로 count 쿼리를 한번 더 날려준다.
    - 기본 쿼리(limit 5설정) : select member0_.member_id as member_i1_0_, member0_.age as age2_0_, member0_.team_id as team_id4_0_, member0_.username as username3_0_ from member member0_ where member0_.age=20 order by member0_.username desc limit 5;
    - 추가 count 쿼리 : select count(member0_.member_id) as col_0_0_ from member member0_ where member0_.age=20;

Slice 인터페이스

// service
PageRequest pageRequest = PageRequest.of(조회 페이지, 조회 데이터의 수, Sort.Direction.DESC, 정렬 필드명);
Page<Member> members = memberRepository.findByAge(age, pageRequest);
// repository
public interface MemberRepository extends JpaRepository<Member, Long> {
    // paging 처리(반환타입 Slice인터페이스)
    Slice<Member> findByAge(int age, Pageable pageable);
}
  • 추가적으로 count쿼리를 날리지않고, 내부적으로 조회 데이터의 수 + 1로 조회를 하여 다음 페이지가 존재하는지 확인이 가능한 페이징 방식(모바일 리스트 더보기 기능에 많이 사용되고 있음)
    - 기본 쿼리(limit 5설정) : select member0_.member_id as member_i1_0_, member0_.age as age2_0_, member0_.team_id as team_id4_0_, member0_.username as username3_0_ from member member0_ where member0_.age=20 order by member0_.username desc limit 6;
profile
코딩요리사

0개의 댓글