[Spring] Pagination과 Page 그리고 Pageable

AlBan·2021년 9월 1일
0

Spring

목록 보기
11/13
post-thumbnail

Pagination

웹 사이트를 이용하며 게시판을 둘러볼 때, 게시글 목록 하단에 게시글을 일정 수로 나누어 페이지화 시켜놓은걸 볼 수 있는데 이를 Pagination(페이지네이션) 이라고 한다.


직접 구현해본 pagination 예제

직관적으로 게시글을 검색할 수 있기 때문에 커뮤니티뿐 아니라 많은 게시글을 보여주는 곳에서 구현 및 사용하고 있다.

구현

pagination을 구현하기 위해서는 현재 페이지번호, 각 페이지별 보여질 내용의 수, 페이지에 들어갈 컨텐츠, 전체 페이지 개수, 전체 데이터의 수가 필요하다.

이 데이터들을 얻으려면 최소 2번의 API 요청(데이터 요청, 데이터 카운트 콜)을 통해 데이터를 가져와야 한다. 2번의 요청이 싫다면, 한번의 요청으로 모든 데이터를 가져와야 하는데 이 경우에는 데이터가 매우 많을 경우에 성능 이슈가 생길 수 있다.

Spring 프레임워크에서는 이러한 고민을 해결 할 수 있는 방법 중 하나가, Spring-Data-JPA 라이브러리의 PagePageable을 이용하는 것이다.

Spring Data JPA와 Pagination

JPA (Java Persistence API)

JPA는 Java Persistence API의 약자이며, 자바 ORM 기술에 대한 표준 명세로 JAVA에서 제공하는 API를 의미한다. 간단히 말하면 자바에서 객체를 DB에 저장/로드 할 때 객체와 데이터베이스 사이에서 매핑을 도와주는 라이브러리를 의미한다.

본문은 JPA에 대한 설명이 아니므로 JPA에 대해서는 여기까지 하고 Pagination 구현을 위해 용이한 메서드에 대해 알아보겠다.

Spring Data Jpa의 제공 메서드

Pageable

Pageable은 Spring JPA에서 DB 쿼리에 쉽고 유연하게 limit 쿼리를 사용할 수 있게 해준다. 특히 JPA를 사용할 때, 자동으로 Pageable 타입의 변수를 넘겨주면 JPA가 DB에 접근해 데이터를 가져올 때 자동으로 limit 조건을 붙여 데이터를 가져온다.

@PageableDefault

Spring의 Controller의 메서드 파라미터에 해당 어노테이션이 선언 된 Pageable 타입 파라미터를 선언하게 되면, API 요청 시 Pageable 객체에 대한 파라미터를 넘겨주지 않아도 자동으로 기본값을 가진 Pageable 타입 파라미터를 제공해준다.

이 어노테이션을 사용하지 않는다면 HandlerMethodArgumentResolver 같은 인터페이스를 구현한 클래스를 만들어 조건에 맞게 매핑을 해줘야 한다.

Page

Pageble을 파라미터로하여 가져온 결과물은 Page<SomeObject> 형태로 반환 되며, Page를 사용한다면 대부분 다수의 row를 가져오기 때문에 Page<List<SomeObject>>의 형태로 반환을 한다. 이 페이지 객체에는 Pagination을 구현할 때 사용하면 좋은 메서드가 있으며 이는 다음과 같다.

getTotalElements()

쿼리 결과물의 전체 데이터 개수이다. 즉, Pageable에 의해 limit키워드가 조건으로 들어가지 않는 쿼리 결과의 수 인데, 주의해야 할 점은 쿼리 결과의 갯수만 가져오지 전체 데이터를 가져오지 않는다는 점이다.
이 메서드는 게시판 기능 사용자에게 전체 데이터 개수를 알려주는 등에 사용하기 좋다.

getTotalPages()

쿼리를 통해 가져온 요소들을 size크기에 맞춰 페이징하였을 때 나오는 총 페이지의 갯수이다.
이를 활용해 쉽게 페이지 버튼의 생성이 가능하다.

getSize()

쿼리를 수행한 전체 데이터에 대해 일정 수 만큼 나눠 페이지를 구성하는데, 이 일정 수의 크기이다.

getNumber()

요소를 가져온 페이지의 번호를 의미한다.

getNumberOfElements()

페이지에 존재하는 요소의 개수이다. 최대 size의 수 만큼 나올 수 있다.

마치며

최근 간단한 웹페이지를 개발하는 프로젝트를 진행하며 배운점들을 정리하고 있다. 특히, Pagination을 구현하면서 많은 생각과 함께 공부를 할 수 있었는데 Page와 함께 JPA Projection에 대해서도 알게되어 Projection에 대해서도 정리하는 시간을 가져야겠다.

웹 어플리케이션을 개발하다 보면, 대부분 게시판 서비스를 제공하게 된다. 그 결과 pagination도 필수적으로 따라붙게 되는데 Spring 어플리케이션을 개발한다면 Spring Data JPA와 함께 제공되는 요소를 잘 사용하여 깔끔하면서도 쉽게 개발하면 좋을것 같다.

profile
[Spring, React를 공부하는 끈질긴 개발자 지망생] 잊어버리지 않도록! 정리 또 정리!

0개의 댓글