Spring
Spring Boot
Pagination

Spring Pagination

Spring에서 Pagination을 적용할 때는 Flutter에서 적용할 때처럼 그런 무지막지한 과정이 없다. (옛날에는 있었지만 지금은 Spring Web에서 처리를 해준다.)

Api Model 생성

Response를 내려줄 Api를 생성해준다.

public class Api<T> {
  private T body;
  private Pagination pagination;
}

Pagination Model 생성

실제로 Pagination을 처리해줄 Model을 생성한다. 각 필드의 역할은 주석으로 적어놓은 다음과 같다.

public class Pagination {
  private Integer page; // 몇 번째 페이지를 보여줄지
  private Integer size; // 한 페이지에 보여줄 elements 수
  private Integer currentElements; // 현재 return된 elements 수
  private Integer totalPages; // 최대 페이지
  private Long totalElements; // 전체 elements 수
}

PageableDefault 설정

PostApiController
  @GetMapping("all")
  public Api<List<PostEntity>> list(
      // direction = Sort.Direction.DESC : 역순(최신순) 기본은 ASC임
      @PageableDefault(page = 0, size = 10, sort = "id", direction = Sort.Direction.DESC)
      Pageable pageable
  ) {
      return postService.all(pageable);
  }

Service에서 Pagination 적용

PostService
  public Api<List<PostEntity>> all(Pageable pageable) {
    Page<PostEntity> list = postRepository.findAll(pageable);
    Pagination pagination = Pagination.builder()
        .page(list.getNumber())
        .size(list.getSize())
        .currentElements(list.getNumberOfElements())
        .totalElements(list.getTotalElements())
        .totalPages(list.getTotalPages())
        .build();
    return Api.<List<PostEntity>>builder()
        .pagination(pagination)
        .body(list.toList())
        .build();
  }