-
Spring boot: PageableSpring Boot 🍃 2023. 12. 4. 00:01
내용 제공 : 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
page
와size
,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);
'Spring Boot 🍃' 카테고리의 다른 글
정규식 모음 (0) 2023.12.04 Spring Boot: 유효성 검증 Validation (0) 2023.12.04 스크래핑 Scraping (0) 2023.12.04 Spring Boot MariaDB 연결 (0) 2023.12.03 Spring boot MultipartFile 확장자 알아내기 (0) 2023.12.03 -