스프링데이터 JPA[쿼리 메서드] - 페이징

2021. 2. 6. 22:33JPA/SPRING DATA JPA

페이징 사용 예)

1
2
3
4
5
6
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);
cs
  • 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 쿼리 없이 결과만 반환

Slice 인터페이스 스펙

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public interface Slice<T> extends Streamable<T> {
    int getNumber(); //현재 페이지
    int getSize(); //페이지 크기
    int getNumberOfElements(); //현재 페이지에 나올 데이터 수
    List<T> getContent(); //조회된 데이터
    boolean hasContent(); //조회된 데이터 존재 여부
    Sort getSort(); //정렬 정보
    boolean isFirst(); //현재 페이지가 첫 페이지 인지 여부
    boolean isLast(); //현재 페이지가 마지막 페이지 인지 여부
    boolean hasNext(); //다음 페이지 여부
    boolean hasPrevious(); //이전 페이지 여부
    Pageable getPageable(); //페이지 요청 정보
    Pageable nextPageable(); //다음 페이지 객체
    Pageable previousPageable();//이전 페이지 객체
    <U> Slice<U> map(Function<super T, ? extends U> converter); //변환기
}
cs

Page 인터페이스 스펙

1
2
3
4
5
public interface Page<T> extends Slice<T> {
    int getTotalPages(); //전체 페이지 수
    long getTotalElements(); //전체 데이터 수
    <U> Page<U> map(Function<super T, ? extends U> converter); //변환기
}
cs

사용 예)

1
2
3
PageRequest pageRequest = PageRequest.of(03, Sort.by(Sort.Direction.DESC, "username"));
Page<Member> page = memberRepository.findByAge(10, pageRequest);
 
cs

PageRequest: Pageable의 구현 클래스

첫번째 인자: offset (0부터 시작)

두번째 인자: limit

세번째 인자: 정렬 정보

DTO로 변환 예)

1
2
Page<Member> page = memberRepository.findByAge(10, pageRequest);
Page<MemberDto> dtoPage = page.map(m -> new MemberDto());
cs