본문 바로가기
Back-end/Spring Boot + REST API

Spring boot - blog application (REST API) : Pagination and Sorting Support

by javapp 자바앱 2022. 6. 30.
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 ==> 마지막 페이지

 

 

 

 

댓글