ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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. 헌치

Designed by Tistory.