728x90
기존 포스트 리스트에서 페이지네이션을 적용시키려고 합니다.
페이지네이션을 사용자가 쉽게 설정할 수 있도록 따로 클래스 작성
AppConstants
package com.springboot.blog.utils;
public class AppConstants
{
// page elements
public static final String DEFAULT_PAGE_NUMBER = "0";
public static final String DEFAULT_PAGE_SIZE= "10";
public static final String DEFAULT_SORT_BY= "id";
public static final String DEFAULT_SORT_DIRECTION= "ASC";
}
payload PostResponse
응답 메시지 객체를 생성
PostDto 리스트와 페이지에 필요한 정보들 포함
@Data
@Builder
public class PostResponse
{
private List<PostDto> content;
private int pageNo;
private int pageSize;
private long totalElements;
private int totalPages;
private boolean last;
}
Controller
// @GetMapping
// public List<PostDto> getAllPosts() {
// return postService.getAllPosts();
// }
// apply pagenation
@GetMapping
public PostResponse getAllPosts(
@RequestParam(defaultValue=AppConstants.DEFAULT_PAGE_NUMBER, required=false)int pageNo,
@RequestParam(defaultValue=AppConstants.DEFAULT_PAGE_SIZE, required=false)int pageSize,
@RequestParam(defaultValue=AppConstants.DEFAULT_SORT_BY, required=false)String sortBy,
@RequestParam(defaultValue=AppConstants.DEFAULT_SORT_DIRECTION, required =false) String sortDir
) {
return postService.getAllPosts(pageNo,pageSize, sortBy,sortDir);
}
Service
public interface PostService
{
public PostDto createPost(PostDto postDto);
// public List<PostDto>getAllPosts();
public PostResponse getAllPosts(int pageNo, int pageSize, String sortBy, String sortDir);
public PostDto getPostById(Long id);
public PostDto updatePost(PostDto postDto, Long id);
public void deletePostById(Long id);
}
PostServiceImpl
// @Override
// public List<PostDto> getAllPosts() {
// List<Post> posts= postRepository.findAll();
// return posts.stream().map(post -> mapToDTO(post)).collect(Collectors.toList());
// }
@Override
public PostResponse getAllPosts(int pageNo, int pageSize, String sortBy, String sortDir)
{
Sort sort= sortDir.equalsIgnoreCase(Sort.Direction.ASC.name()) ? Sort.by(sortBy).ascending() :
Sort.by(sortBy).descending();
Pageable pageable =PageRequest.of(pageNo, pageSize, sort);
Page<Post> posts= postRepository.findAll(pageable);
// get content for page object
List<Post> listOfPosts= posts.getContent();
List<PostDto> contents= listOfPosts.stream().map(post -> mapToDTO(post)).collect(Collectors.toList());
PostResponse postResponse= PostResponse.builder()
.content(contents)
.pageNo(posts.getNumber())
.pageSize(posts.getSize())
.totalElements(posts.getTotalElements())
.totalPages(posts.getTotalPages())
.last(posts.isLast())
.build();
return postResponse;
}
Test
페이지 0번, 페이지 사이즈 10개, 정렬 기준 : title, 내림차순
http://localhost:8080/api/posts?pageNo=0&pageSize=5&sortBy=title&sortDir=DESC
{
"content": [
{
"id": 2,
"title": "My second New Post",
"description": "Post second description",
"content": "This is my second new Post"
},
{
"id": 1,
"title": "My modify New Post",
"description": "Post modify description",
"content": "This is my modify new Post"
},
{
"id": 12,
"title": "My 9 Post",
"description": "Post 9 description",
"content": "This is 9 Post"
},
{
"id": 11,
"title": "My 8 Post",
"description": "Post 8 description",
"content": "This is 8 Post"
},
{
"id": 10,
"title": "My 7 Post",
"description": "Post 7 description",
"content": "This is 7 Post"
}
],
"pageNo": 0,
"pageSize": 5,
"totalElements": 12,
"totalPages": 3,
"last": false
}
Post 리스트와
페이지 정보가 잘 받아와졌다!
마지막 페이지 요청
http://localhost:8080/api/posts?pageNo=2&pageSize=5&sortBy=title&sortDir=DESC
{
"content": [
{
"id": 14,
"title": "My 11 Post",
"description": "Post 11 description",
"content": "This is 1 Post"
},
{
"id": 13,
"title": "My 10 Post",
"description": "Post 10 description",
"content": "This is 10 Post"
}
],
"pageNo": 2,
"pageSize": 5,
"totalElements": 12,
"totalPages": 3,
"last": true
}
"last" : true ==> 마지막 페이지
'Back-end > Spring Boot + REST API' 카테고리의 다른 글
Spring boot - blog application (REST API) : ModelMapper (0) | 2022.07.04 |
---|---|
Spring boot - blog application (REST API) : Comment (0) | 2022.07.03 |
Spring boot - blog application (REST API) : Post CRUD (0) | 2022.06.29 |
Spring boot - blog application (REST API) (0) | 2022.06.28 |
Spring Boot 컨트롤러에서 데이터 받는 방법(@RequestBody, @RequestParam, @PathVariable) (0) | 2022.06.27 |
댓글