1. 개요

페이지 매김은 큰 데이터 세트가 있고 사용자에게 더 작은 덩어리로 표시하려는 경우에 종종 유용합니다.

또한 페이징하는 동안 특정 기준에 따라 해당 데이터를 정렬해야 하는 경우가 종종 있습니다.

이 예제에서는 Spring Data JPA를 사용하여 쉽게 페이지를 매기고 정렬하는 방법을 배웁니다.

2. 초기 설정

먼저 도메인 클래스로 Product 엔터티 가 있다고 가정해 보겠습니다 .

@Entity 
public class Product {
    
    @Id
    private long id;
    private String name;
    private double price; 

    // constructors, getters and setters 

}

제품 인스턴스에는 고유 식별자인 id , 해당 이름 및 관련 가격 이 있습니다.

3. 저장소 생성

Product 에 액세스하려면 ProductRepository 가 필요합니다  .

public interface ProductRepository extends PagingAndSortingRepository<Product, Integer> {

    List<Product> findAllByPrice(double price, Pageable pageable);
}

PagingAndSortingRepository 를 확장함으로써 페이징 및 정렬을 위한 findAll(Pageable pageable)findAll(Sort sort) 메소드를 얻  습니다.

반대로 PagingAndSortingRepository 도 확장하므로  대신  JpaRepository 를 확장하도록 선택할 수  있습니다.

PagingAndSortingRepository 를 확장하면 여기에서 findAllByPrice 로 수행한 것처럼 Pageable 및  Sort 를 매개변수로 사용하는 자체 메서드를 추가할 수 있습니다  .

새로운 방법을 사용하여 Product 의 페이지를 매기는 방법을 살펴보겠습니다  .

4. 페이지 매김

PagingAndSortingRepository 에서 리포지토리를 확장한 후에는 다음을 수행해야 합니다.

  1. Pageable 인터페이스 의 구현인 PageRequest 객체 생성 또는 획득
  2. 사용하려는 저장소 메서드에 대한 인수로 PageRequest 개체를 전달 합니다.

요청된 페이지 번호와 페이지 크기를 전달 하여 PageRequest 객체를 생성할 수 있습니다 .

여기서 페이지 수는 0부터 시작합니다.

Pageable firstPageWithTwoElements = PageRequest.of(0, 2);

Pageable secondPageWithFiveElements = PageRequest.of(1, 5);

Spring MVC에서는 Spring Data Web Support 를 사용하여 컨트롤러에서 Pageable 인스턴스 를 얻도록 선택할 수도 있습니다 .

PageRequest 개체 가 있으면 저장소의 메서드를 호출하는 동안 전달할 수 있습니다.

Page<Product> allProducts = productRepository.findAll(firstPageWithTwoElements);

List<Product> allTenDollarProducts = 
  productRepository.findAllByPrice(10, secondPageWithFiveElements);

findAll(Pageable pageable) 메서드 는 기본적으로 Page<T>  개체를 반환합니다.

그러나 페이지가 매겨진 데이터를 반환하는 사용자 지정 메서드에서 Page<T>, Slice <T> 또는 List<T> 를 반환하도록 선택할 수 있습니다 .

Page < T> 인스턴스는 Product List 외에도 사용 가능한 총 페이지 수를 알고 있습니다. 이를 달성하기 위해 추가 카운트 쿼리를 트리거합니다. 이러한 오버헤드 비용을 피하기 위해 대신 Slice<T> 또는 List<T> 를 반환할 수 있습니다 .

슬라이스다음 슬라이스가 사용 가능한지 여부만 알고 있습니다.

5. 페이지 매기기 및 정렬

마찬가지로 쿼리 결과  를 정렬하려면 Sort 인스턴스를 메서드에 전달하기만 하면 됩니다.

Page<Product> allProductsSortedByName = productRepository.findAll(Sort.by("name"));

그러나 데이터를 정렬하고 페이징하려면 어떻게 해야 할까요?

정렬 세부 정보를 PageRequest 개체 자체 에 전달하여 이를 수행할 수 있습니다 .

Pageable sortedByName = 
  PageRequest.of(0, 3, Sort.by("name"));

Pageable sortedByPriceDesc = 
  PageRequest.of(0, 3, Sort.by("price").descending());

Pageable sortedByPriceDescNameAsc = 
  PageRequest.of(0, 5, Sort.by("price").descending().and(Sort.by("name")));

정렬 요구 사항에 따라 PageRequest 인스턴스 를 생성하는 동안 정렬 필드와 정렬 방향을 지정할 수 있습니다 .

평소와 같이 이 페이지 가능 유형 인스턴스를 리포지토리의 메서드에 전달할 수 있습니다.

6. 결론

이 기사에서는 Spring Data JPA에서 쿼리 결과를 페이지로 나누고 정렬하는 방법을 배웠습니다.

항상 그렇듯이 이 기사에서 사용된 전체 코드 예제는 Github에서 사용할 수 있습니다 .

Persistence footer banner