파란하늘의 지식창고
반응형

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); 
}
반응형
profile

파란하늘의 지식창고

@Bluesky_

내용이 유익했다면 광고 배너를 클릭 해주세요