간단한 게시판 만들기 - 페이지 개념 주입하기

Gihongg·2024년 4월 18일

Spring Boot

목록 보기
21/24

페이지 기능이 필요한 이유

게시판을 만들 때 어떤 Board의 전체 Post를 조회하는 기능을 만들었다.

그런데 이 기능에서는 Post가 365개가 있을 때

Post1
Post2
Post3
.
.
.
Post365

와 같이 모두를 한꺼번에 보여주고 있다.

이렇게 했을 때 사용자는 한 페이지에 과도한 정보를 받고, 성능에 악영향을 줄 가능성이 높다.

그래서 페이지네이션 기능이 필요하다.

페이지네이션의 이점

성능 향상
: 한 번에 전체 데이터를 로드하는 대신 필요한 부분만 로드하여 성능을 향상시킵니다.
사용자 경험 개선
: 사용자가 원하는 데이터를 빠르게 찾을 수 있도록 도움을 줍니다.
서버 부하 감소
: 서버에 들어오는 요청을 분산시켜 서버 부하를 줄입니다.
네트워크 트래픽 관리
: 한 번의 요청으로 너무 많은 데이터를 전송하지 않게 함으로써 네트워크 트래픽을 관리합니다.

사용법

  1. Api와 Pagination 파일을 만들어 각각의 클래스를 만들어준다.
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;

}
  1. 위의 두 클래스를 만들었다면 PostApiController의 "/all" 경로를 할당 받는 all 클래스를 찾아 Pageable을 쿼리 파라미터로 받아줄 수 있도록 해야한다.
    @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을 넘겨준다.
    }
  1. 이제 postService의 all 메서드를 수정해주자.
    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;

profile
전천후 개발자

0개의 댓글