-
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
Spring Data JPA - Reference Documentation
Example 109. Using @Transactional at query methods @Transactional(readOnly = true) interface UserRepository extends JpaRepository { List findByLastname(String lastname); @Modifying @Transactional @Query("delete from User u where u.active = false") void del
docs.spring.io
[Stackoverflow] Page<> vs Slice<> when to use which?
Page<> vs Slice<> when to use which?
I've read in Spring Jpa Data documentation about two different types of objects when you 'page' your dynamic queries made out of repositories. Page and Slice Page<User> findByLastname(String
stackoverflow.com
create by. 헌치