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 에서 리포지토리를 확장한 후에는 다음을 수행해야 합니다.
- Pageable 인터페이스 의 구현인 PageRequest 객체 생성 또는 획득
- 사용하려는 저장소 메서드에 대한 인수로 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에서 사용할 수 있습니다 .