Pageable

Pageable

  • query string으로 page, size 정보가 들어왔을 때, controller에서 입력 파라미터로 사용 가능

  • sort 객체를 입력 파라미터로 받거나 Direction 객체와 함께 properties를 입력받으면 정렬 기능도 수행해준다.

  • 구성 요소

    • page : 요청할 페이지 번호

    • size : 한 페이지 당 조회 할 갯수 (default : 20)

    • sort : Sorting에 대한 값 설정하는 파라미터로, 기본적으로 오름차순이다. 표기는 정렬한 필드명,정렬기준 ex) createdDate,desc

  • PageRequest는 Pageable 인터페이스의 구현체이며, 직접 Pageable 객체를 생성해줄 때 사용할 수 있다.

    • PageRequst.of(page, size)

    • PageRequst.of(page, size, sort)

    • PageRequest.of(page,vsize, direction, "property1", "property2", ..)

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();  // 이전 페이지가 있는지 여부 

  	// 페이지 요청 정보
	default Pageable getPageable() {
		return PageRequest.of(getNumber(), getSize(), getSort());
	}

	// 다음 페이지 정보
	Pageable nextPageable();

	// 이전 페이지 정보
	Pageable previousPageable();

		
	<U> Slice<U> map(Function<? super T, ? extends U> converter);
	default Pageable nextOrLastPageable() {
		return hasNext() ? nextPageable() : getPageable();
	}
	
	default Pageable previousOrFirstPageable() {
		return hasPrevious() ? previousPageable() : getPageable();
	}
}

Page

  • Slice 인터페이스를 상속받은 인터페이스

  • 전체 데이터 개수를 조회해 가지고 있기 때문에 전체 데이터 개수, 페이지 개수를 getTotalElements(), getTotalPages() 메서드로 얻을 수 있다.

Page vs Slice

  • 페이징 처리에 다양한 리턴타입을 제공하는 만큼 요구사항에 따라서 Page와 Slice를 사용하면 될 것 같다.

  • 전체 페이지 개수와 전체 데이터 수를 이용하는 실제 게시판 형식의 페이징 처리를 구현해야한다면 Page를 사용

  • 무한 스크롤 방식을 사용한다면 전체 페이지와 데이터 개수가 필요없기 때문에 Slice 방식을 이용하는 것이 효율적

Last updated