API 페이징 설계 가이드

offset/limit vs cursor 기반 페이징, 정렬/중복/성능까지 포함한 실무 체크리스트


API 페이징은 “목록 API의 UX/성능/정확성”을 동시에 좌우합니다.

1) offset/limit 페이징 (page 기반)

예: GET /posts?limit=20&offset=40

  • 장점: 단순, 구현 쉬움
  • 단점: 데이터가 자주 변하면 중복/누락이 생기기 쉬움, offset이 커질수록 느려질 수 있음

2) cursor 페이징 (cursor 기반)

예: GET /posts?limit=20&cursor=...

  • 장점: 큰 데이터에서 성능이 안정적이고, 변경에도 상대적으로 강함
  • 단점: cursor 설계가 필요(정렬 키, 인코딩/서명 등)

cursor를 설계할 때 자주 쓰는 패턴

  • 정렬 키: created_at DESC, id DESC 같이 동일 값 충돌을 깨는 보조 키를 포함
  • cursor 값: 마지막 아이템의 (created_at, id)를 base64 등으로 인코딩

3) 실무 체크리스트

  • 정렬(order) 규칙을 명확히 문서화
  • 중복/누락 방지를 위한 결정적 정렬(deterministic ordering) 적용
  • 응답에 nextCursor 또는 hasNext 제공
  • DB 인덱스가 정렬/필터 조건과 맞는지 확인 (인덱스, EXPLAIN)