무한 스크롤을 위한 CursorPagination과 OffsetPagination의 차이
API에서 대량의 데이터를 효율적으로 처리하기 위한 두 가지 페이지네이션 방식의 특징과 적용 상황을 비교
페이지네이션이 필요한 이유
성능 향상: 대량 데이터 처리 부담 감소로 응답 시간 단축
네트워크 부하 감소: 불필요한 데이터 전송 방지
사용자 경험 개선: 필요한 만큼의 데이터만 빠르게 로드
OffsetPagination
동작 원리
데이터베이스의 OFFSET과 LIMIT 절 사용
"100번째 아이템부터 10개를 보여줘" 방식으로 동작
장점
직관적인 구현
페이지 점프 가능
단점
offset 값이 커질수록 쿼리 속도 급격히 저하
데이터 중복/누락 발생 가능 (실시간 데이터 변경 시)
CursorPagination
동작 원리
커서(특정 아이템의 위치를 가리키는 고유한 값) 사용
"이 아이템 다음부터 10개를 보여줘" 방식으로 동작
정렬 기준이 되는 컬럼 필수
장점
일정한 쿼리 성능 (페이지가 깊어져도 성능 저하 없음)
데이터 일관성 보장
실시간 데이터에 적합
단점
페이지 점프 불가 (이전/다음 페이지만 이동 가능)
복잡한 구현 (ordering 필드 신중한 설정 필요)
전체 개수 미제공
선택 가이드
성능
페이지가 깊어질수록 느려짐
일정함
데이터 일관성
중복/누락 발생 가능
보장됨
페이지 이동
특정 페이지 점프 가능
이전/다음만 가능
주요 사용처
검색 결과, 관리자 페이지
무한 스크롤, SNS 피드, 채팅 목록
선택 기준
실시간으로 데이터가 변하고 무한 스크롤 UI → CursorPagination
특정 페이지 점프 기능 필요 → OffsetPagination
대용량 데이터셋 (수만 건 이상) → CursorPagination 고려
실무 주의사항
DB 인덱스 필수: ordering에 사용되는 필드에 반드시 인덱스 생성
CursorPagination의 ordering 필드는 유니크한 값 보장하는 필드 조합으로 설정 (예: ['-created_at', '-id'])
프론트엔드와 명확한 소통: CursorPagination은 count 값 미제공
Last updated
