내용 제공 : Chat GPT
Chat GPT와 함께 하는 Pageable 공부 !
이해가 좀 되면 더 깊이 공부해 볼 사이트 : tecoble.techcourse
일반적으로 JPA와 함께 사용한다.
페이징 처리를 간편하게 하기 위해 제공되는 인터페이스로,
Spring Data JPA 에서 지원한다.
Spring Data JPA의
PagingAndSortingRepository
또는 JpaRepository
인터페이스의
메서드 파라미터로 전달
될 수 있다.
pageable 인터페이스의 구현체는
PageRequest
, AbstractPageRequest
가 있다.
가장 일반적으로 사용되는 Pageable 구현체이다.
페이지 번호
, 페이지 크기
및 정렬 정보
를 기반으로 페이지네이션을 수행한다.
@GetMapping
public ResponseEntity<?> searchCompany(final Pageable pageable) {
Page<CompanyEntity> companies = this.companyService.getAllCompany(pageable);
return ResponseEntity.ok(companies);
}
페이지 번호.
page parameter가 입력되면
입력 받은 page(번호)에 해당되는 페이지를 넘겨준다.
http://localhost:8080/company?page=3
한 페이지당 게시글 개수.
size parameter가 입력되면
한 페이지 크기가 size인 페이징을 처리하여 첫번째 페이지를 넘겨준다.
http://localhost:8080/company?size=3
정렬 기준 컬럼 지정.
sort parameter가 입력되면
입력받은 sort 컬럼을 기준으로 오름차순 정렬하여 첫번째 페이지를 넘겨준다.
http://localhost:8080/company?sort=ticker
http://localhost:8080/company?page=3&size=1
page
와 size
, sort
parameter가 입력되면
sort는 정렬 기준 값으로,
size는 페이지 크기로,
page는 넘겨 받을 페이지 번호로 계산되어
입력 받은 page 번호에 해당되는 페이지를 생성하여 넘겨준다.
http://localhost:8080/company?sort=ticker&size=1&page=1
어떻게 사용하는지 상상이 안가지만 언젠가
예시 제공 : ChatGPT
package org.springframework.data.domain;
import java.util.Optional;
import org.springframework.util.Assert;
/**
* Abstract interface for pagination information.
*
* @author Oliver Gierke
* @author Mark Paluch
*/
public interface Pageable {
/**
* Returns a {@link Pageable} instance representing no pagination setup.
*
* @return
*/
static Pageable unpaged() {
return Unpaged.INSTANCE;
}
/**
* Creates a new {@link Pageable} for the first page (page number {@code 0}) given {@code pageSize} .
*
* @param pageSize the size of the page to be returned, must be greater than 0.
* @return a new {@link Pageable}.
* @since 2.5
*/
static Pageable ofSize(int pageSize) {
return PageRequest.of(0, pageSize);
}
/**
* Returns whether the current {@link Pageable} contains pagination information.
*
* @return
*/
default boolean isPaged() {
return true;
}
/**
* Returns whether the current {@link Pageable} does not contain pagination information.
*
* @return
*/
default boolean isUnpaged() {
return !isPaged();
}
/**
* Returns the page to be returned.
*
* @return the page to be returned.
*/
int getPageNumber();
/**
* Returns the number of items to be returned.
*
* @return the number of items of that page
*/
int getPageSize();
/**
* Returns the offset to be taken according to the underlying page and page size.
*
* @return the offset to be taken
*/
long getOffset();
/**
* Returns the sorting parameters.
*
* @return
*/
Sort getSort();
/**
* Returns the current {@link Sort} or the given one if the current one is unsorted.
*
* @param sort must not be {@literal null}.
* @return
*/
default Sort getSortOr(Sort sort) {
Assert.notNull(sort, "Fallback Sort must not be null!");
return getSort().isSorted() ? getSort() : sort;
}
/**
* Returns the {@link Pageable} requesting the next {@link Page}.
*
* @return
*/
Pageable next();
/**
* Returns the previous {@link Pageable} or the first {@link Pageable} if the current one already is the first one.
*
* @return
*/
Pageable previousOrFirst();
/**
* Returns the {@link Pageable} requesting the first page.
*
* @return
*/
Pageable first();
/**
* Creates a new {@link Pageable} with {@code pageNumber} applied.
*
* @param pageNumber
* @return a new {@link PageRequest}.
* @since 2.5
*/
Pageable withPage(int pageNumber);
/**
* Returns whether there's a previous {@link Pageable} we can access from the current one. Will return
* {@literal false} in case the current {@link Pageable} already refers to the first page.
*
* @return
*/
boolean hasPrevious();
/**
* Returns an {@link Optional} so that it can easily be mapped on.
*
* @return
*/
default Optional<Pageable> toOptional() {
return isUnpaged() ? Optional.empty() : Optional.of(this);
}
}
페이징을 사용하지 않고 데이터를 가져올 때 사용
Pageable pageable = Pageable.unpaged();
Page<YourEntity> result = yourRepository.findAll(pageable);
한 페이지의 크기를 지정.
JPA와 함께 사용될 때 sql의 limit 처럼 사용될 수도 있다!
// 페이지 크기 20으로 설정하여 첫 번째 페이지의 데이터를 가져옴
PageRequest pageRequest = PageRequest.of(0, 20);
Page<YourEntity> result = yourRepository.findAll(pageRequest);
PageRequest 객체가 페이징된 요청인지 여부를 확인하는 데 사용
PageRequest pageRequest = PageRequest.of(0, 10);
boolean isPaged = pageRequest.isPaged();
System.out.println("Is paged request? " + isPaged);
PageRequest 객체가 페이징 되지 않은 요청인지 여부를 확인하는 데 사용
PageRequest pageRequest = PageRequest.of(0, 10);
boolean isUnpaged = pageRequest.isUnpaged();
System.out.println("Is unpaged request? " + isUnpaged);
현재 페이지 번호 가져옴
// 현재 페이지 번호 2로 설정한 PageRequest 객체 생성
Pageable pageable = PageRequest.of(1, 10);
int pageNumber = pageable.getPageNumber();
System.out.println("Current page number: " + pageNumber);
한 페이지에 포함되는 항목의 수 가져옴
// 페이지 크기 10으로 설정한 PageRequest 객체 생성
Pageable pageable = PageRequest.of(0, 10);
int pageSize = pageable.getPageSize();
System.out.println("Page size: " + pageSize);
오프셋 값은 현재 페이지의 첫 번째 항목의 인덱스를 의미한다.
// 현재 페이지 번호 2, 페이지 크기 10으로 설정한 PageRequest 객체 생성
Pageable pageable = PageRequest.of(1, 10);
long offset = pageable.getOffset();
System.out.println("Current page offset: " + offset);
정렬 정보를 담고 있는 Sort 객체를 반환
// 페이지 번호 0, 페이지 크기 10, 정렬 기준을 name 필드로 설정한 PageRequest 객체 생성
Pageable pageable = PageRequest.of(0, 10, Sort.by("name"));
Sort sort = pageable.getSort();
System.out.println("Sort information: " + sort);
정렬 정보가 없는 경우 대체 정렬 정보를 반환
// 페이지 번호 0, 페이지 크기 10로 설정한 PageRequest 객체 생성
Pageable pageable = PageRequest.of(0, 10);
Sort defaultSort = Sort.by("name"); // 대체 정렬 정보
Sort sort = pageable.getSortOr(defaultSort);
System.out.println("Sort information: " + sort);
next() 메서드를 호출하면
현재 페이지의 다음 페이지 정보를 가진 Pageable 객체가 생성되어 반환
// 현재 페이지 번호 0, 페이지 크기 10으로 설정한 PageRequest 객체 생성
Pageable currentPageable = PageRequest.of(0, 10);
Pageable nextPageable = currentPageable.next();
System.out.println("Next page: " + nextPageable);
이전 페이지의 Pageable 객체를 생성하여 반환하거나,
현재 페이지가 첫 번째 페이지인 경우 현재 페이지의 Pageable 객체를 반환
// 현재 페이지 번호 1, 페이지 크기 10으로 설정한 PageRequest 객체 생성
Pageable currentPageable = PageRequest.of(1, 10);
Pageable previousPageable = currentPageable.previousOrFirst();
System.out.println("Previous page: " + previousPageable);
첫 번째 페이지의 Pageable 객체를 생성하여 반환
// 페이지 크기 10으로 설정한 PageRequest 객체 생성
Pageable firstPageable = PageRequest.of(0, 10);
Pageable nextPageable = firstPageable.first();
System.out.println("First page: " + nextPageable);
현재 Pageable 객체와 동일한 페이지 크기를 유지하면서,
주어진 페이지 번호로 변경된 새로운 Pageable 객체가 생성되어 반환됨
// 현재 페이지 번호 1, 페이지 크기 10으로 설정한 PageRequest 객체 생성
Pageable currentPageable = PageRequest.of(1, 10);
int newPageNumber = 2;
Pageable newPageable = currentPageable.withPage(newPageNumber);
System.out.println("New page: " + newPageable);
현재 페이지의 이전 페이지 존재 여부를 확인
// 현재 페이지 번호 2, 페이지 크기 10으로 설정한 PageRequest 객체 생성
Pageable currentPageable = PageRequest.of(2, 10);
boolean hasPreviousPage = currentPageable.hasPrevious();
System.out.println("Has previous page? " + hasPreviousPage);
Pageable 객체를 Optional로 감싸서 반환한다.
이를 통해 Pageable 객체가 null인 경우에도 Optional을 통해 안전하게 처리할 수 있다.
// 페이지 번호 0, 페이지 크기 10으로 설정한 PageRequest 객체 생성
Pageable pageable = PageRequest.of(0, 10);
Optional<Pageable> optionalPageable = pageable.toOptional();
System.out.println("Optional Pageable: " + optionalPageable);