게시글등을 조회하는 API 에서 응답하는 데이터의 갯수가 많아지면 클라이언트에서 볼때 아래로 쭉 늘어지게 되므로 페이지 처리를 통해 가독성 좋게 표현해야한다.
물론 서버는 그대로 한개의 리스트 형태로 데이터를 보내주고 프론트엔드에서 처리를 통하여 클라이언트에게 보여줄 수 있지만 Spring Data에서 페이징 및 정렬 기능을 제공하기 때문에 손쉽게 페이징, 정렬을 구현하여 프론트에게 보내줄 수 있다.
클라이언트에서 서버에게 조회 api 요청 시 페이징 처리에 필요한 몇가지 옵션과 함께 요청하면 서버측에서 페이징 처리를 통해 그에 맞춰 가공하여 보내줄 수 있다.
- page : 조회할 페이지 번호
- size : 한 페이지에 보여줄 상품 개수
- sortBy : 정렬 항목
- isAsc : 오름차순
@GetMapping("/posts/search/paging")
public JsonResponse<Page<PostResponseDto>> getPostsPaging(int size, int page, String sortBy, boolean isAsc){
return JsonResponse.success(postService.getPosts(size, page-1, sortBy, isAsc));
}
컨트롤러에서 다음과 같이 size, page, sortBy, isAsc와 함께 조회 api를 요청받는 컨트롤러 메소드 클라이언트가 페이지를 요청할 때 1부터 시작하게 되지만 페이징 처리에서는 0부터 시작하게 되므로 page -1 해주었다.
public Page<PostResponseDto> getPosts(int size, int page, String sortBy, boolean isAsc) {
Sort.Direction direction = isAsc ? Sort.Direction.ASC : Sort.Direction.DESC;
Sort sort = Sort.by(direction, sortBy);
Pageable pageable = PageRequest.of(page, size, sort);
Page<Post> productList = postRepository.findAll(pageable);
return productList.map(PostResponseDto::new);
}
서비스에서는 입력받은 옵션들을 사용하여 페이징 처리를 하여 Dto로 변환하여 반환한다.
우선 isAsc가 true라면 Sort.Direction을 ASC로 false라면 DESC로 초기화 하여 Sort객체를 생성한다.
그 후 Pagable 객체를 입력받은 page, size 그리고 생성된 인스턴스sort를 인자로 하여 Pageable객체를 생성한다.
그후 생성된 Pageable 클래스의 인스턴스 pageable을 인자로 하여 postRepository에서 조회한다. Pagaeable을 파라미터로 받는 findAll메소드는 이미 선언되어있어 따로 처리가 필요가 없다.
findAll을 통해 반환받은 값의 자료 형은 Page<Post>이므로 이를 요청하기 위해 PostResponseDto 의 생성자를 통해Page<PostResponseDto>로 변환하여 반환한다.
http://localhost:8080/api/posts/search/paging?size=3&page=1&sortBy=id&isAsc=true
다음과 같이 요청하게 되면 id를 기준으로 오름차순으로 정렬된 데이터의 한페이지의 데이터 갯수가 3개인 1페이지를 응답받는다.
응답 받은 데이터의 JSON형식은 우선 상태를 나타내는 result_code와 데이터를 나타내는 result로 이루어져있고
result의 하위에는 content와 pageable객체의 정보를 담고있는 pageable로 이루어져있다.
page를 2로 바꾸면 다음 3개의 데이터를 받는다.
'백엔드(Back End) > Spring' 카테고리의 다른 글
[TIL]20230718 - Spring Boot 이미지 업로드 구현 (0) | 2023.07.18 |
---|---|
[TIL]20230713 - RefreshToken (0) | 2023.07.14 |
[TIL]20230711 - 회원탈퇴 기능 구현 (0) | 2023.07.11 |
[Spring]@ControllerAdvice를 이용한 전역 예외 처리 (1) | 2023.07.10 |
[TIL]20230710 - 게시글 및 댓글에 좋아요 기능 구현 (1) | 2023.07.10 |