web/SpringBoot

[REST API] 페이징(Paging) 처리하기

뽀리님 2023. 11. 6. 14:58

지금 진행하고 있는 프로젝트에서, 처음에 내가 API 개발을 해줄 때 페이징 처리까지 다 해서 줬었더랬다..

근데, 위에서 View 단에서 다 알아서 할테니 그냥 전체리스트를 넘겨달라고 하더라?

 

... 아니 View에서 알아서 처리한다고? 어떻게 한다는거지?? 내가 모르는 신박한 방법이 있나? 싶어 일단 군말없이 시키는대로 했다.

 

하지만 성능테스트를 위해 확인해보니 View에서 페이징를 위해 전체 리스트를 갖고와서 리스트에 넣어둔 뒤 페이지마다 10개씩 뿌려주는식 ㅋㅋㅋㅋ 

예상은 했지만 정말로 이렇게 진행을 해놨더라. ㅜ ㅜ....

 

결국 이슈로 제기해서 기존에 해줬던 방식으로 소스를 원복하였다.

잡소리가 길었다.  이 글을 읽으시는분들은  이런식으로 페이징처리 하지말기를...

 

원복하는김에 생각보다 페이징은 복잡하지 않기에 정리해본다.

 

참고->개발환경스펙

IntelliJ + SpringBoot 3.1.0 + Mybatis + Mysql8.0.2

 

1. Spring DATA JPA에서 지원하는 Pagable 을 쓰면 간단하다.

library 임포트

implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

 

2.  요청시 API 파라미터로 현재페이지번호, 총 보여줄 컬럼 갯수를 받는다

public Result getNoticeList( @Parameter(description="현재 페이지번호",example = "1") @RequestParam(required = false) Integer page,
                             @Parameter(description="페이지에 보여줄 컬럼수",example = "20") @RequestParam(required = false) Integer cntPerPage)

 

3. Pageble 객체를 세팅한다.

var pageable = ObjectUtils.isNotEmpty(page) && ObjectUtils.isNotEmpty(cntPerPage)
        && page > 0 && cntPerPage > 0 ? PageRequest.of(page-1,cntPerPage) : null;
noticeService.getNoticeListProc(pageable); // 리스트조회

 

4. Mybatis 일경우 쿼리를 아래와 같이 세팅(Mysql+Mybatis)

<if test = "pageable">
    LIMIT ${pageable.pageSize} OFFSET ${pageable.offset}
</if>

 

 

5.JPA를 쓰는경우

Page<NoticeEntity> page = noticeRepository.findAll(pageable);

// 페이징 정보를 사용하여 필요한 정보 추출
List<NoticeEntity> content = page.getContent(); // 현재 페이지의 엔티티 목록
long totalElements = page.getTotalElements(); // 전체 엔티티 개수
int totalPages = page.getTotalPages(); // 전체 페이지 개수

 

 

조회해보니 잘된다

-끝-