- 데이터를 일정한 크기로 나누어 페이지 단위로 제공하는 방식
- 대량의 데이터를 사용자에게 필요한 데이터만 표시하기 위해 사용
페이지네이션 구현 방법 종류
1. Offset 기반 페이지네이션
OFFSET과 LIMIT을 사용하여 특정 범위의 데이터를 가져오는 방식
OFFSET: 반환할 행의 개수
LIMIT: 반환할 행의 시작 위치 지정
- 데이터가 많아질수록 큰 OFFSET에서 성능이 저하
- OFFSET은 결과를 반환하기 전에 지정된 건너뛸 행까지의 데이터를 모두 스캔하고, 이후 행만 반환
- OFFSET이 클수록 스캔해야 할 데이터 양이 증가하므로 성능 저하가 발생
SELECT *
FROM products
ORDER BY product_id
LIMIT 10 OFFSET 20;
2. Cursor 기반 페이지네이션
- 이전 페이지의 마지막 데이터(Cursor)를 기준으로 다음 데이터를 가져오는 방식
- OFFSET을 사용하지 않고 WHERE 조건을 활용
- OFFSET 방식의 성능 저하 문제를 해결
- 이전 페이지의 마지막 데이터를 저장하고 있어야 함으로 구현이 상대적으로 복잡
SELECT *
FROM products
WHERE product_id > 100
ORDER BY product_id
LIMIT 10;
비교
| 구분 | Offset 기반 페이지네이션 | Cursor 기반 페이지네이션 |
|---|
| 구현 난이도 | 쉬움 | 상대적으로 어려움 |
| 성능 | 데이터가 많아질수록 OFFSET이 커질 때 성능 저하 | 데이터 크기와 무관하게 일정한 성능 유지 |
| 데이터 일관성 | 데이터 추가/삭제 시 페이지 데이터가 변동될 가능성 있음 | 데이터 추가/삭제에도 일관성 유지 가능 |
| 역방향 페이지네이션 | 쉽게 구현 가능 | 구현이 복잡하거나 추가적인 작업 필요 |
| 필요 조건 | OFFSET과 LIMIT 지원 | 이전 페이지의 마지막 데이터(Cursor) 정보를 저장해야 함 |
| 대규모 데이터셋 처리 | 비효율적 | 효율적 |
| 사용 예시 | 간단한 데이터 조회 (게시판, 소규모 데이터) | 대규모 데이터셋 (로그 데이터, 무한 스크롤 등) |