페이지네이션(Pagination)

개굴이·2023년 10월 20일
0

Java

목록 보기
7/7
post-thumbnail

페이지네이션(Pagination)

여러개의 컨텐츠를 여러 페이지로 나누어 보여주고 페이지 번호 버튼, 이전 버튼, 다음 버튼을 눌러서 페이지를 이동하는 기능

필요한 내용

한 페이지에서 보여줄 페이지 버튼의 개수
한 페이지에서 보여줄 컨텐츠 개수
이전 버튼, 다음 버튼

계산해야할 내용

총 페이지 개수
화면에 보여질 페이지 그룹
화면에 보여질 첫번째 페이지 번호
화면에 보여질 마지막 페이지 번호

총 페이지 개수

Math.ceil(전체 컨텐츠 개수/한 페이지에서 보여줄 컨텐츠 개수)
ex) 총 페이지 개수 = Math.ceil(111/10) = 12페이지

화면에 보여질 페이지 그룹

Math.ceil(현재 페이지 번호/한 페이지에서 보여줄 페이지 버튼의 개수)
ex) 한 화면에 보여줄 페이지 그룹 = Math.ceil(7/5) = 2번째 페이지 그룹

화면에 보여질 첫번째 페이지 번호

((페이지 그룹 - 1) * 한 페이지에서 보여줄 페이지 버튼의 개수) + 1
ex) 화면에 보여질 첫번째 페이지 번호 = ((2-1) * 5) + 1 = 6

화면에 보여질 마지막 페이지 번호

페이지 그룹 * 한 페이지에서 보여줄 페이지 버튼의 개수
ex) 화면에 보여질 마지막 페이지 번호 = 2 * 5 = 10
하지만 전체 페이지보다 크다면 마지막 페이지 번호 = 총 페이지 개수
ex)현재 페이지가 12 라면
페이지 그룹 : 3
첫번째 페이지 번호 : 11
마지막 페이지 번호 : 15 > 총 페이지 개수 12 이므로 마지막 페이지 번호는 12가 된다.

Offset 페이징

SELECT * FROM 테이블
ORDER BY 컬럼
OFFSET 10 LIMIT 5

offset에서 시작하여 limit만큼 가져온다.
JPA > Pageable 객체 사용

Cursor 페이징

offset은 이전의 데이터를 조회하고 건너 뛰는 것이므로 데이터가 많을 수록 시간복잡도가 증가한다. 또한 삽입 삭제가 이루어질 경우 다음페이지에서 이전 페이지와 중복되는 데이터가 보일 수 있다.

cursor는 특정 조건 이후에 있는 데이터만 선별해서 가져온다.

SELECT * FROM 테이블
WHERE cursor > timestamp
ORDER BY timestamp
LIMIT 5

커서 페이징을 사용할 때 주의 사항
기준 컬럼이 중복된 값을 갖지 않고 순차적이어야 한다. 따라서 대부분 timestamp 컬럼을 기준으로 사용한다.
중복이 발생하는 컬럼을 커서로 사용하면 데이터 손실이 발생할 수 있다.

0개의 댓글