참고 문서
Pageable
: Spring Data에서 제공하는 Pagenation 정보를 담기 위한 인터페이스를 말합니다.
ex) 페이지 번호, 페이지 크기, 정렬 방식 등 ...
AbstractPageRequest
: Pageable 인터페이스를 구현하는 추상 클래스입니다. 기본적인 페이징 처리 로직을 제공합니다.
PageRequest
: AbstractPageRequest를 상속받아 구현한 클래스입니다. 일반적인 데이터베이스 환경에서 사용할 수 있는 Pagenation의 표준적인 처리를 제공합니다.
위는 "📜템플릿 메서드 패턴(행동 패턴)" 에 따라 설계된 형태입니다.
AbstractPageRequest는 알고리즘의 구조를 정의하고, PageRequest는 그 구조를 기반으로 구체적인 동작을 구현한 객체입니다.
가장 의문이었던 점은 page의 size가 의미하는 것이 한페이지에 들어갈 데이터의 갯수인지, 아니면 페이지 목록 중 노출될 항목을 의미하는지 헤깔렸습니다.
pageNumber
: 현재 페이지, *0부터 시작.
pageSize
: 한 페이지에 노출할 데이터 건수.
sort
: 정렬 기준 및 방향을 담은 객체.
properties
: 정렬 시 기준이 될 속성.
위 처럼 정리할 수 있습니다. 기억할 내용은 pageSize 가 한 페이지에 노출할 데이터 갯수를 의미하고, 첫 페이지가 0부터라는 것입니다.
객체 생성 시, 매개변수 값에 -1을 해줘야 의도한 페이지를 가져올 수 있습니다.
JPA에서는 여러 DB 방언(dialect)를 추상화하여 하나의 방법으로 페이징 처리를 구현할 수 있도록 제공해줍니다.
JPA 관련 Spring 모듈인 Spring Data JPA 에서는 전체 데이터를 기반으로 전체 페이지 갯수, 현재 페이지 위치, 이전 또는 다음 페이지가 존재하는지 등의 관련 기능들을 추상화하여 제공합니다.
PageRequest의 팩토리 패턴의 of 메서드를 통해 Pageable 객체를 생성합니다.
pageNumber는 1을 최소값으로 설정하였으며, pageSize는 15항목을 설정했습니다.
JpaRepository 상속 시, PagingAndSortingRepository도 함께 상속 받기 때문에 default로 페이징 처리가 가능합니다.
레포지토리를 통해 Pageable 구현체를 입력하면, Page 또는 Slice 타입의 객체를 페이징 처리 결과를 반환받습니다.
Page
: 조회 쿼리 이후에 전체 데이터의 count(갯수)를 조회하는 쿼리가 실행됩니다.
Slice
: Limit의 크기가 size에 +1된 값을 갖는 쿼리를 생성하고, count(갯수)를 조회하는 쿼리가 실행되지 않습니다.
일반적으로, 데이터 양이 많고 전체 데이터 갯수를 조회할 상황이 아닌 경우, Slice 객체를 반환하는 것이 유리합니다.
게시판에 전체 게시글 수를 입력하기 위해 Page 객체를 반환하도록 구현하였습니다.