피드로 돌아가기
Dev.toDatabase
원문 읽기
Index 기반 Cursor Pagination 도입을 통한 O(1) 시간 복잡도 달성과 데이터 Drift 해결
Cursor Pagination Step by Step
AI 요약
Context
Offset Pagination의 LIMIT/OFFSET 구조는 데이터 셋이 커질수록 Database가 이전 행을 모두 읽고 버리는 비효율을 초래함. 또한 데이터 삽입/삭제 시 페이지 밀림 현상으로 인한 중복 노출 및 누락 문제가 발생함.
Technical Solution
- Index가 적용된 Unique 및 Immutable한 컬럼(예: ID)을 Bookmark로 활용하는 Cursor 방식 채택
- WHERE id > cursor 쿼리를 통한 Full Scan 배제 및 Index Range Scan으로 직접 접근 유도
- count 쿼리 비용 절감을 위해 limit + 1개의 레코드를 요청하여 다음 페이지 존재 여부를 판별하는 최적화 적용
- Prisma ORM의 cursor 옵션과 skip: 1 설정을 통한 중복 레코드 제외 처리
- Timestamp 기반 정렬 시 발생 가능한 중복 값 문제를 해결하기 위해 (createdAt, id) 복합 정렬 조건 적용
- Client에게 Cursor를 Opaque한 Base64 형태로 전달하여 내부 구현 은닉 및 API 안정성 확보
실천 포인트
- 무한 스크롤 UI 구현 시 Offset 대신 Cursor Pagination 적용 검토 - Cursor 컬럼 선정 시 Unique, Immutable, Indexed 속성 충족 여부 확인 - 다음 페이지 존재 확인을 위한 별도 count 쿼리 대신 limit + 1 전략 사용 - 정렬 기준 컬럼이 Unique하지 않을 경우 반드시 ID와 같은 Tiebreaker 추가