Pageable, @PageableDefault
@GetMapping("/product/search")
public Page<ProductResponse> searchProduct(
@RequestParam(value = "category", required = false) String category,
@RequestParam(value = "price", required = false) Integer price,
@PageableDefault(
page = 0,
size = 10,
sort = "id",
direction = Direction.DESC) Pageable pageable) {
ProductVO productVO = ProductVO.of(category, price);
return productService.searchProductByPriceAndCategory(productVO, pageable);
}
스프링에서는 queryparamter로 전달받는 페이징 정보를 Pageable로 받을 수 있습니다.
Pageable로 받기 위해서 Controller 메서드의 Pageable pageable이라 작성하면 됩니다.
기본값 설정을 하려면 @PageableDefault 어노테이션을 사용합니다.
주로 설정하는 값은 page, size, sort, direction이 있습니다.
🚗 실제로 요청을 보낸 다음에 값이 어떻게 전달되는지 확인해 보겠습니다.
요청 보낸 endpoint와 queryparameter는 아래와 같습니다.
/search?category=book&price=1000&page=0&size=10&sort=id,asc&sort=price,desc
정렬 조건을 복수개로 주게 되면, Pageable 인터페이스에 sort에 여러 개의 값이 설정됩니다.
Sort의 Java Doc를 보면 List<Order>를 가지고 있습니다. 즉, 여러 개의 정렬 정보를 가지고 있음
Order 객체는 정렬 방향과 정렬할 속성을 통해 만들어지며, queryparameter로 전달받은 한 쌍이 하나의 Order로 만들어집니다. (기본 정렬 방향은 Direction.ASC로 설정되어 있습니다. (오름차순))
Pageable 안 쓰는 방법
@GetMapping("/product/search")
public Page<ProductResponse> searchProduct(
@RequestParam(value = "category", required = false) String category,
@RequestParam(value = "price", required = false) Integer price,
@RequestParam(name = "page") Integer page,
@RequestParam(name = "size") Integer size,
@RequestParam(name = "sort") List<String> sort) {
ProductVO productVO = ProductVO.of(category, price);
Pageable pageable = PageRequest.of(page, size, getSort(sort));
return productService.searchProductByPriceAndCategory(productVO, pageable);
}
//===//
private Sort getSort(List<String> sortParams) {
List<Sort.Order> orders = new ArrayList<>();
if (sortParams != null) {
for (String param : sortParams) {
// "id,asc" 또는 "price,desc" 형식의 파라미터 처리
String[] sortParam = param.split(",");
if (sortParam.length == 2) {
String property = sortParam[0];
Sort.Direction direction = Sort.Direction.fromString(sortParam[1]);
orders.add(new Sort.Order(direction, property));
} else {
orders.add(new Sort.Order(Direction.DESC, sortParam[0]));
}
}
}
return Sort.by(orders);
}
Pageable 인터페이스로 전달받지 않으면, 페이징 정보를 받을 Parameter를 모두 선언해야 합니다.
page, size, sort 선언해 주기
sort는 여러 개의 정렬 조건이 올 수도 있기 때문에 List<String> 자료형으로 작성합니다.
여기서 값은
- 단일 정보 : id
- 단일 정보 + 방향 : id,asc
- 복수 정보 : id, price
- 복수 정보 + 방향 : id,asc, price,desc
등 여러 개의 값이 오기도 하고 방향 값을 전달 안 할 수도 있습니다.
이를 처리하기 위한 메서드(getSort())를 생성하여 필드와 방향을 파싱 하여 Sort 객체를 생성해야 합니다.
스프링에서 지원해 주는 Pageable을 사용하면 좀 더 간편하고 많은 기능을 사용할 수 있어, 지원해주는 기술을 사용하는 것이 더 효율적이라 생각이 듭니다.
'Spring Framework > Spring' 카테고리의 다른 글
Spring 정렬 Sort, Order 클래스 이해하기 - 정렬 방향, 속성 접근하기 (0) | 2024.11.08 |
---|---|
Spring MessageSource를 이용한 다국어 메시지 처리: LocaleResolver와 LocaleContextHolder 활용법 (1) | 2024.10.19 |
Spring StdSerializer, @JsonSerializer 커스텀 직렬화 처리 방법 (1) | 2024.10.16 |
Spring Scope 어노테이션으로 빈 라이프사이클 이해하기 - prototype, request, session (4) | 2024.10.13 |
스프링 FactoryBean: 생성자 주입과 필드 주입 시 프록시 객체의 동작 차이 (0) | 2024.10.12 |