Today
-
Yesterday
-
Total
-
  • Spring boot: Pageable
    Spring 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

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

    '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

Designed by Tistory / Custom by 얼거스