[Spring] Simple Board - 구현 4

HOJUN·2024년 6월 16일

Backend - Spring

목록 보기
25/34

Pagination

사용자가 게시판의 글을 열람하기 위해 게시판을 요청할 때
만약 게시글이 10개가 한 페이지에 존재한다면, 한 번에 다 볼 수 있다.

만약 게시글이 100만개가 한 페이지에 존재한다면, 한 번에 다는 커녕 페이지 로드 속도가 매우 느릴 수도 있다.

매번 요청할 때마다 게시글 전체를 가져오게 되면 매우 불편함을 느낄 것이기 때문에
조금씩 (1~n) 그리고 원할 때 다음 n개를 가져오게 된다.

프론트엔드에서 페이지를 나눠서 보여주기 위해서 몇가지 정보가 필요하다.

public class Pagination {

    private Integer page;

    private Integer size;

    private Integer currentElements;

    private Integer totalPage;

    private Long totalElements;
}

페이지 번호, 한 페이지의 게시글 크기, 현재 보여줄 페이지 번호, 총 페이지 수, 총 게시글 수가 있다.

@GetMapping("/all")
public API<List<PostEntity>> list(
        @PageableDefault(page = 0, size = 10, sort = "id", direction = Sort.Direction.DESC)
        Pageable pageable
){
    return postService.all(pageable);
}

모든 게시글 리스트를 보고 싶은데 페이지를 나눌 수 있다.
@PageableDefault로 기본값을 설정하고 id의 내림차순으로 정렬하면 최신글부터 보여줄 수 있겠다.
기본값이 아닐 경우 Query Parameter로 page와 size를 받을 수 있다.

public API<List<PostEntity>> all(Pageable pageable){
        var list = postRepository.findAll(pageable);

        var pagination = Pagination.builder()
                .page(list.getNumber())
                .size(list.getSize())
                .currentElements(list.getNumberOfElements())
                .totalElements(list.getTotalElements())
                .totalPage(list.getTotalPages())
                .build()
                ;

        var response = API.<List<PostEntity>>builder()
                .body(list.toList())
                .pagination(pagination)
                .build();

        return response;
    }

post 테이블에서 모든 글을 리스트에 담아서 pagination 객체를 builder패턴으로 만들 때
요청으로 받은 page와 size를 담아 객체를 만들어 body에 리스트를 담고 페이지 정보를 붙여서 response를 내린다.

16개의 글을 작성했고 8개씩 페이지를 만들고 싶다면


Query Parameter로 전달할 수 있겠다.
우리가 전달할 정보들까지 정확하게 전달하는 것을 볼 수 있다.

0개의 댓글