← 블로그 목록

Developer Knowledge

개발자가 알아야 할 지식: 커서 페이지네이션, 다음 페이지는 숫자가 아니라 위치다

offset pagination의 한계와 cursor 기반 페이지네이션이 무한 스크롤과 변경 많은 데이터에 유리한 이유를 설명합니다.

GraphQL Foundation
  • 개발자가 알아야 할 지식
  • API Design
  • Databases
  • Performance

커서 페이지네이션는 코드가 커지고 사용자가 늘어날수록 조용히 중요해지는 실무 개념입니다. 처음에는 세부 구현처럼 보이지만, 실제로는 시스템이 실패를 어떻게 다룰지 정하는 기준이 됩니다.

왜 개발자가 알아야 하나

커서 페이지네이션는 작은 코드 조각보다 시스템의 약속에 더 가깝습니다.

이 기준이 없으면 구현은 동작해도 운영 순간에 비용, 장애, 데이터 불일치가 드러납니다.

개발자가 이 개념을 알면 설계 결정의 이유를 더 분명히 설명하고, 장애가 나기 전에 위험을 줄일 수 있습니다.

핵심 개념

첫 번째 핵심은 경계입니다. 커서 페이지네이션가 적용되는 범위와 적용되지 않는 범위를 구분해야 합니다. 경계가 흐리면 예외 처리가 곳곳에 흩어지고, 나중에는 같은 문제가 서로 다른 방식으로 해결됩니다.

두 번째 핵심은 계약입니다. 서버, 클라이언트, 데이터베이스, 운영 도구가 어떤 값을 믿고 어떤 실패를 허용하는지 문서와 코드에 함께 드러나야 합니다.

세 번째 핵심은 관측 가능성입니다. 제대로 설계했는지 알려면 성공 경로뿐 아니라 거절, 충돌, 지연, 재시도 같은 사건도 로그와 지표로 확인할 수 있어야 합니다.

작은 예시 또는 체크리스트

피드에서 OFFSET 1000 LIMIT 20을 쓰면 앞쪽 데이터가 추가되거나 삭제될 때 같은 항목이 다시 보이거나 건너뛸 수 있습니다. created_atid를 묶은 커서를 쓰면 마지막으로 본 위치 이후의 데이터를 안정적으로 가져올 수 있습니다.

  • 정렬 기준이 항상 결정적이고 고유한가?
  • 커서가 사용자가 임의로 조작해도 안전한 형태인가?
  • 새 데이터가 끼어드는 상황에서 중복과 누락이 허용 범위 안인가?
  • 역방향 페이지 이동이 필요한지 제품 요구사항을 확인했는가?
  • 커서에 담긴 필드 변경이 API 호환성을 깨지 않는가?

실무에서 자주 생기는 오해

  • “페이지 번호가 사용자에게 더 쉽다”는 말은 일부 화면에서만 맞습니다. 끝없는 피드나 로그에서는 위치 기반이 더 자연스럽습니다.

  • “커서는 그냥 마지막 ID다”도 부족합니다. 정렬 기준이 시간이라면 동률을 깨는 ID까지 함께 필요할 수 있습니다.

  • “offset도 인덱스 있으면 괜찮다”는 생각은 큰 offset에서 비용과 일관성 문제를 놓칩니다.

오늘 바로 적용해보기

무한 스크롤 API 하나를 골라 중복과 누락 가능성을 테스트하세요.

정렬 기준에 동률이 생길 때 결과 순서가 흔들리지 않는지 확인하세요.

커서 포맷을 외부 계약으로 보고 버전 변경 가능성을 고려하세요.

더 알아보기

오늘의 takeaway

커서 페이지네이션은 몇 번째 묶음인지보다, 마지막으로 어디까지 봤는지를 더 정확히 기억합니다.