[속닥속닥] Spring Data JPA 페이징 방식 : Page vs Slice (vs List)

헌치·2022년 8월 9일
2

우아한테크코스

목록 보기
22/30

해당 글은 속닥속닥 기술블로그에 작성된 글과 동일합니다.

속닥속닥 링크

코드

@Repository
public interface PostRepository extends JpaRepository<Post, Long> {

    Slice<Post> findSliceBy(Pageable pageable);
    Page<Post> findPostsByMemberOrderByCreatedAtDesc(Pageable pageable, Member member);
}

0. intro

우리 코드는 원래 Slice를 이용해 페이징 했다.

그런데 이번에 "내가 쓴 글 조회" API총 페이지 수도 필요로 했다.

찾아보니 Page를 통해 기존 Slice 기능과 더불어, 총 페이지 수 도 알 수 있었다.

다만 Page 는 생성 비용이 Slice 보다 많이 드므로

총 페이지 수 를 알 필요 없다면 Slice를 쓰면 될 것 같다.


1. Page 인터페이스

보다시피, Slice 인터페이스를 상속한다

public interface Page<T> extends Slice<T> {
    // 전체 페이지 개수
    int getTotalPages();
    // 전체 요소 개수
    long getTotalElements();
    // / 변환기
    <U> Page<U> map(Function<? super T, ? extends U> converter); // 변환기
}

2. Slice 인터페이스

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> convert); // 변환기
}

3. Spring Docs 번역

4.4.4. 특수 매개변수 처리

쿼리의 매개변수를 처리하려면 앞의 예에서 이미 본 것처럼 메서드 매개변수를 정의하십시오. Pageable그 외에도 인프라는 및 와 같은 특정 유형을 인식 Sort하여 쿼리에 페이지 매김 및 정렬을 동적으로 적용합니다. 다음 예에서는 이러한 기능을 보여줍니다.

예 14. 쿼리 메서드에서 PageableSlice, List 사용

Page<User> findByLastname(String lastname, Pageable pageable);
Slice<User> findByLastname(String lastname, Pageable pageable);
List<User> findByLastname(String lastname, Sort sort);
List<User> findByLastname(String lastname, Pageable pageable);

1) Page

Pageable 인스턴스를 쿼리 메서드에 전달하여 정적으로 정의된 쿼리에 페이징을 동적으로 추가할 수 있습니다.

Page사용 가능한 요소의 개수페이지의 개수를 알고 있습니다. 

  • 전체 수를 계산하기 위해 카운트 쿼리를 트리거하는 인프라에 의해 수행됩니다.
  • 이것은 비용이 많이 들 수 있으므로 대신 Slice를 리턴하세요.

2) Slice

Slice는 다음 Slice가 사용 가능한지 여부만 알고 있으며, 이는 더 큰 결과 집합을 탐색할 때 충분할 수 있습니다.

  • 정렬 옵션을 Pageable인스턴스 를 통해 처리할 수 있습니다.
  • 만약 정렬만 필요한 경우 메소드에  Sort매개변수를 추가하십시오.

3) List

보시다시피 List 리턴도 가능합니다. 이 경우 실제 Page 인스턴스를 구축하는 데 필요한 추가 메타데이터가 생성되지 않습니다. 즉, 추가 count 쿼리가 실행되지 않습니다. 주어진 엔터티 범위만 조회하도록 쿼리를 제한합니다.

참고자료

[Spring Docs]#repositories.special-parameters
[Stackoverflow] Page<> vs Slice<> when to use which?
https://wonit.tistory.com/483

profile
🌱 함께 자라는 중입니다 🚀 rerub0831@gmail.com

0개의 댓글