게시판을 만들 때 어떤 Board의 전체 Post를 조회하는 기능을 만들었다.
그런데 이 기능에서는 Post가 365개가 있을 때
Post1
Post2
Post3
.
.
.
Post365
와 같이 모두를 한꺼번에 보여주고 있다.
이렇게 했을 때 사용자는 한 페이지에 과도한 정보를 받고, 성능에 악영향을 줄 가능성이 높다.
그래서 페이지네이션 기능이 필요하다.
성능 향상
: 한 번에 전체 데이터를 로드하는 대신 필요한 부분만 로드하여 성능을 향상시킵니다.
사용자 경험 개선
: 사용자가 원하는 데이터를 빠르게 찾을 수 있도록 도움을 줍니다.
서버 부하 감소
: 서버에 들어오는 요청을 분산시켜 서버 부하를 줄입니다.
네트워크 트래픽 관리
: 한 번의 요청으로 너무 많은 데이터를 전송하지 않게 함으로써 네트워크 트래픽을 관리합니다.
package org.example.simpleboard.common;
import lombok.*;
@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Api<T> {
private T body;
private Pagination pagination;
}
그리고
package org.example.simpleboard.common;
import lombok.*;
@Getter
@Setter
@ToString
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Pagination {
private Integer page;
private Integer size;
private Integer currentElements;
private Integer totalPage;
private Long totalElements;
}
@GetMapping("/all")
public Api<List<PostEntity>> all(
//리턴값을 body값과 Pagenation을 같이 보내주기 위해 Api로 감쌌다
@PageableDefault(page = 0,size = 10, sort = "id",direction = Sort.Direction.DESC)
Pageable pageable
//쿼리 파라미터로 Pageable을 받는다.
//page, size의 기본값을 정해주고, id를 기준으로 내림차순 정렬을 설정
){
return postService.all(pageable);
//postService의 all 메서드에 pageable을 넘겨준다.
}
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 respoense= Api
.<List<PostEntity>>builder()
.body(list.toList())
.pagination(pagination)
.build();
return respoense;
}
Pageable을 import시 아래의 경로를 받자.
import org.springframework.data.domain.Pageable;