해당 글은 속닥속닥 기술블로그에 작성된 글과 동일합니다.
코드
@Repository
public interface PostRepository extends JpaRepository<Post, Long> {
Slice<Post> findSliceBy(Pageable pageable);
Page<Post> findPostsByMemberOrderByCreatedAtDesc(Pageable pageable, Member member);
}
우리 코드는 원래 Slice
를 이용해 페이징 했다.
그런데 이번에 "내가 쓴 글 조회" API
는 총 페이지 수
도 필요로 했다.
찾아보니
Page
를 통해 기존Slice
기능과 더불어,총 페이지 수
도 알 수 있었다.
다만 Page
는 생성 비용이 Slice
보다 많이 드므로
총 페이지 수
를 알 필요 없다면Slice
를 쓰면 될 것 같다.
Page
인터페이스보다시피, Slice
인터페이스를 상속한다
public interface Page<T> extends Slice<T> {
// 전체 페이지 개수
int getTotalPages();
// 전체 요소 개수
long getTotalElements();
// / 변환기
<U> Page<U> map(Function<? super T, ? extends U> converter); // 변환기
}
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); // 변환기
}
쿼리의 매개변수를 처리하려면 앞의 예에서 이미 본 것처럼 메서드 매개변수를 정의하십시오. Pageable
그 외에도 인프라는 및 와 같은 특정 유형을 인식 Sort
하여 쿼리에 페이지 매김 및 정렬을 동적으로 적용합니다. 다음 예에서는 이러한 기능을 보여줍니다.
예 14. 쿼리 메서드에서 Pageable
, Slice
, 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);
Pageable
인스턴스를 쿼리 메서드에 전달하여 정적으로 정의된 쿼리에 페이징을 동적으로 추가할 수 있습니다.
Page
는 사용 가능한 요소의 개수
와 페이지의 개수
를 알고 있습니다.
Slice
를 리턴하세요.Slice
는 다음 Slice
가 사용 가능한지 여부만 알고 있으며, 이는 더 큰 결과 집합을 탐색할 때 충분할 수 있습니다.
Pageable
인스턴스 를 통해 처리할 수 있습니다.Sort
매개변수를 추가하십시오.보시다시피 List
리턴도 가능합니다. 이 경우 실제 Page
인스턴스를 구축하는 데 필요한 추가 메타데이터가 생성되지 않습니다. 즉, 추가 count 쿼리가 실행되지 않습니다. 주어진 엔터티 범위만 조회하도록 쿼리를 제한합니다.
[Spring Docs]#repositories.special-parameters
[Stackoverflow] Page<> vs Slice<> when to use which?
https://wonit.tistory.com/483