Spring Data의 Pageable을 사용한 경우 이 pageable 객체를 parameter로 받아 처리하고 싶은 경우가 있다.
예를 들어 게시글 목록을 조회하는 경우 다음과 같은 controller를 사용한다고 하면
@GetMapping("/findByBoardAlias")
public Page<BoardArticle> findByBoardAlias(@RequestParam String boardAlias, Pageable pageable) {
return boardArticleService.findByAlias(boardAlias, pageable);
}
위와 같이 getmapping에서 Pageable을 처리하게 된다.
위의 호출을 예를 들어 단순히 boardAlias로만 조회를 하는 경우 다음과 같이 호출한다.
/findByBoardAlias?boardAlias=free
만약 페이지를 조회하는 경우 page parameter를 추가하면 된다.
page는 0부터 시작하며 해당 값을 생략하면 default value는 0이다.
/findByBoardAlias?boardAlias=free&page=0
page의 size를 추가하여 조회하는 경우 다음과 같이 size parameter를 추가하면 된다.
생략한 경우 size의 default value는 20이다.
/findByBoardAlias?boardAlias=free&page=0&size=20
조회 기준을 추가하는 경우 sort parameter에 [조회키, 정렬 방향] 형태의 값을 추가하면 된다.
정렬 방향은 asc, desc가 있다.
예를 들어 id 값을 기준으로 내림차순 정렬을 조회하는 경우 다음과 같다.
정렬 방향은 생략할 수 있으며 생략한 경우 defalut value는 asc이다.
/findByBoardAlias?boardAlias=free&sort=id,desc
정렬 기준의 경우 복수 값을 지원한다.
예를 들어 id로 내림차순(desc), boardId로 오름차순(asc)으로 조회하는 경우 다음과 같이 sort parameter를 여러 개 사용하면 된다.
/findByBoardAlias?boardAlias=free&sort=id,desc&sort=boardId,asc
Spring의 @RequestParam을 사용한 argument가 배열이나 List로 인 경우 쉼표(,)를 단위로 배열 값을 설정하게 된다.
따라서 위의 sort 호출처럼 sort=id,desc 와 같이 선언하면 배열에 쪼개져서 설정되게 된다.
Pageable이나 Sort의 경우 @RequestParam을 선언하지 않는다.
Pageable을 매개변수로 선언한 경우 PageableHandlerMethodArgumentResolver에서 처리를 하며 그 안에서 SortHandlerMethodArgumentResolver가 sort parameter를 가져와서 id,desc와 같이 sort기준으로 값을 설정하게 해 준다.
Sort를 매개변수로 지정하여 사용하면 SortHandlerMethodArgumentResolver가 처리해 준다.
아래처럼 Sort를 받아 처리할 수도 있다.
@GetMapping("/findByBoardAlias")
public Page<BoardArticle> findByBoardAlias(@RequestParam String boardAlias, @RequestParam int page, Sort sort) {
var pageable = PageRequest.of(page, 20, sort)
return boardArticleService.findByAlias(boardAlias, pageable);
}
Pageable의 기본 값을 지정하기 위한 @PageableDefault, @SortDefault annotation을 제공한다.
예를 들어 size가 10이고 기본 정렬 기준을 id desc로 하려는 경우 다음과 같이 @PageableDefault를 설정하면 된다.
해당 값을 지정하여 호출하지 않는 경우 기본 값을 사용하게 된다.
@GetMapping("/findByBoardAlias")
public Page<BoardArticle> findByBoardAlias(@RequestParam String boardAlias, @PageableDefault(size = 10, sort="id", direction = Direction.DESC) Pageable pageable) {
return boardArticleService.findByAlias(boardAlias, pageable);
}
Sort만 따로 매개변수로 지정하는 경우를 @SortDefault를 사용하면 된다.
하지만 Sort 매개변수에서만 사용할 수 있는 게 아니고 Pageable에서도 사용할 수 있다.
이전 예에서 @PageableDefault로 선언한 기본 값 중 정렬 관련 기본 값은 다음과 같이 @SortDefault로 선언할 수 있다.
@GetMapping("/findByBoardAlias")
public Page<BoardArticle> findByBoardAlias(@RequestParam String boardAlias, @PageableDefault(size = 10) @SortDefault(sort = "id", direction = Direction.DESC) Pageable pageable) {
return boardArticleService.findByAlias(boardAlias, pageable);
}
복수의 sort를 사용하는 경우 기본 값 설정을 각각 지정하려면 @SortDefaults를 사용하면 된다. (끝에 s가 붙어있음)
예를 들어 이전 예에서 처럼 id,desc boardId,asc를 기본 값으로 지정하고자 하는 경우 다음과 같이 @SortDefaults에 @SortDefault 값을 배열로 선언하면 된다.
@GetMapping("/findByBoardAlias")
public Page<BoardArticle> findByBoardAlias(@RequestParam String boardAlias,
@PageableDefault(size = 10)
@SortDefaults({
@SortDefault(sort = "id", direction = Direction.DESC),
@SortDefault(sort = "boardId", direction = Direction.ASC)
}) Pageable pageable) {
return boardArticleService.findByAlias(boardAlias, pageable);
}
'Study > Java' 카테고리의 다른 글
JDK 20 New Features (0) | 2023.05.07 |
---|---|
spring-asciidoctor-backends 사용해 보기 (0) | 2023.05.06 |
RestTemplate response generic type 사용하기 (0) | 2023.05.05 |
ObjectMapper readValue generic type 사용하기 (0) | 2023.04.23 |
springdoc-openapi swagger @ExampleObject annotation 사용해 보기 (0) | 2023.04.13 |
Spring Boot 프로젝트 logback accesslog 설정하기 (Tomcat Servlet 기준) (0) | 2023.02.17 |
maven multi module project에서 jib build 사용하기 (0) | 2023.02.15 |
Spring Session 사용해 보기 (0) | 2023.02.03 |
Spring Boot Thymeleaf 사용해 보기 (0) | 2023.02.01 |
Spring Boot Admin 사용해 보기 (0) | 2023.01.30 |