Spring boot: Pageable

김아무개·2023년 5월 31일
0

Spring Boot 🍃

목록 보기
25/95

내용 제공 : Chat GPT

Chat GPT와 함께 하는 Pageable 공부 !

이해가 좀 되면 더 깊이 공부해 볼 사이트 : tecoble.techcourse

Pageable

  • 일반적으로 JPA와 함께 사용한다.

  • 페이징 처리를 간편하게 하기 위해 제공되는 인터페이스로,
    Spring Data JPA 에서 지원한다.

  • Spring Data JPA의
    PagingAndSortingRepository 또는 JpaRepository 인터페이스의
    메서드 파라미터로 전달될 수 있다.

  • pageable 인터페이스의 구현체는
    PageRequest , AbstractPageRequest 가 있다.


Spring Data JPA

  • JPA를 좀 더 간편하게 사용할 수 있도록 기능을 확장하고, 보다 쉬운 개발을 지원.

PageRequest

가장 일반적으로 사용되는 Pageable 구현체이다.
페이지 번호, 페이지 크기정렬 정보를 기반으로 페이지네이션을 수행한다.

사용 예시

@GetMapping
public ResponseEntity<?> searchCompany(final Pageable pageable) {
    Page<CompanyEntity> companies = this.companyService.getAllCompany(pageable);
    return ResponseEntity.ok(companies);
}

간단한 url 파라미터 사용 정보

int page

페이지 번호.

page parameter가 입력되면
입력 받은 page(번호)에 해당되는 페이지를 넘겨준다.

사용 예시

http://localhost:8080/company?page=3

int size

한 페이지당 게시글 개수.

size parameter가 입력되면
한 페이지 크기가 size인 페이징을 처리하여 첫번째 페이지를 넘겨준다.

사용 예시

http://localhost:8080/company?size=3

Sort sort

정렬 기준 컬럼 지정.

sort parameter가 입력되면
입력받은 sort 컬럼을 기준으로 오름차순 정렬하여 첫번째 페이지를 넘겨준다.

사용 예시

http://localhost:8080/company?sort=ticker

page , size , sort 값을 섞어서 조회할 수도 있다.

int page, int size

http://localhost:8080/company?page=3&size=1

int page, int size, Sort sort

pagesize , sort parameter가 입력되면
sort는 정렬 기준 값으로,
size는 페이지 크기로,
page는 넘겨 받을 페이지 번호로 계산되어
입력 받은 page 번호에 해당되는 페이지를 생성하여 넘겨준다.

사용 예시

http://localhost:8080/company?sort=ticker&size=1&page=1


어떻게 사용하는지 상상이 안가지만 언젠가

도움이 될까 싶어 뜯어보는 Pageable 인터페이스

예시 제공 : 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);
	}

}

사용 예시

unpaged()

페이징을 사용하지 않고 데이터를 가져올 때 사용

Pageable pageable = Pageable.unpaged();

Page<YourEntity> result = yourRepository.findAll(pageable);

ofSize(int pageSize)

한 페이지의 크기를 지정.
JPA와 함께 사용될 때 sql의 limit 처럼 사용될 수도 있다!

// 페이지 크기 20으로 설정하여 첫 번째 페이지의 데이터를 가져옴
PageRequest pageRequest = PageRequest.of(0, 20);

Page<YourEntity> result = yourRepository.findAll(pageRequest);

isPaged()

PageRequest 객체가 페이징된 요청인지 여부를 확인하는 데 사용

PageRequest pageRequest = PageRequest.of(0, 10);

boolean isPaged = pageRequest.isPaged();
System.out.println("Is paged request? " + isPaged);

isUnpaged()

PageRequest 객체가 페이징 되지 않은 요청인지 여부를 확인하는 데 사용

PageRequest pageRequest = PageRequest.of(0, 10);

boolean isUnpaged = pageRequest.isUnpaged();
System.out.println("Is unpaged request? " + isUnpaged);

getPageNumber();

현재 페이지 번호 가져옴

// 현재 페이지 번호 2로 설정한 PageRequest 객체 생성
Pageable pageable = PageRequest.of(1, 10);

int pageNumber = pageable.getPageNumber();
System.out.println("Current page number: " + pageNumber);

getPageSize();

한 페이지에 포함되는 항목의 수 가져옴

// 페이지 크기 10으로 설정한 PageRequest 객체 생성
Pageable pageable = PageRequest.of(0, 10);

int pageSize = pageable.getPageSize();
System.out.println("Page size: " + pageSize);

getOffset();

오프셋 값은 현재 페이지의 첫 번째 항목의 인덱스를 의미한다.

// 현재 페이지 번호 2, 페이지 크기 10으로 설정한 PageRequest 객체 생성
Pageable pageable = PageRequest.of(1, 10);

long offset = pageable.getOffset();
System.out.println("Current page offset: " + offset);

getSort();

정렬 정보를 담고 있는 Sort 객체를 반환

// 페이지 번호 0, 페이지 크기 10, 정렬 기준을 name 필드로 설정한 PageRequest 객체 생성
Pageable pageable = PageRequest.of(0, 10, Sort.by("name"));

Sort sort = pageable.getSort();
System.out.println("Sort information: " + sort);

getSortOr(Sort 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();

next() 메서드를 호출하면
현재 페이지의 다음 페이지 정보를 가진 Pageable 객체가 생성되어 반환

// 현재 페이지 번호 0, 페이지 크기 10으로 설정한 PageRequest 객체 생성
Pageable currentPageable = PageRequest.of(0, 10);

Pageable nextPageable = currentPageable.next();
System.out.println("Next page: " + nextPageable);

previousOrFirst();

이전 페이지의 Pageable 객체를 생성하여 반환하거나,
현재 페이지가 첫 번째 페이지인 경우 현재 페이지의 Pageable 객체를 반환

// 현재 페이지 번호 1, 페이지 크기 10으로 설정한 PageRequest 객체 생성
Pageable currentPageable = PageRequest.of(1, 10);

Pageable previousPageable = currentPageable.previousOrFirst();
System.out.println("Previous page: " + previousPageable);

first();

첫 번째 페이지의 Pageable 객체를 생성하여 반환

// 페이지 크기 10으로 설정한 PageRequest 객체 생성
Pageable firstPageable = PageRequest.of(0, 10);

Pageable nextPageable = firstPageable.first();
System.out.println("First page: " + nextPageable);

withPage(int pageNumber);

현재 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);

hasPrevious();

현재 페이지의 이전 페이지 존재 여부를 확인

// 현재 페이지 번호 2, 페이지 크기 10으로 설정한 PageRequest 객체 생성
Pageable currentPageable = PageRequest.of(2, 10);

boolean hasPreviousPage = currentPageable.hasPrevious();
System.out.println("Has previous page? " + hasPreviousPage);

toOptional()

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);
profile
Hello velog! 

0개의 댓글