-
Spring Data JPA 페이징 방식 : Page vs Slice (vs List)카테고리 없음 2022. 8. 10. 00:20
@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. 쿼리 메서드에서
Pageable
,Slice
및 사용Sort
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?
create by. 헌치