반응형
커서 기반 페이징(Cursor-based Pagination)은 대량의 데이터셋을 효율적으로 페이지별로 나누어 가져오는 방법 중 하나입니다. 주로 API에서 사용되며, 특히 데이터베이스에서 많은 양의 데이터를 클라이언트에게 전달할 때 자주 사용됩니다. 이 방식은 오프셋 기반 페이징(offset-based pagination)과 비교되는 방법입니다.
커서 기반 페이징의 원리
커서 기반 페이징은 현재 위치를 나타내는 고유한 지표(커서)를 사용하여 다음 페이지의 데이터를 가져옵니다. 이 커서는 보통 데이터베이스 레코드의 고유한 식별자(예: ID, 타임스탬프 등)를 사용하며, 이 값을 기준으로 이후의 데이터를 조회하게 됩니다.
예를 들어, 만약 레코드가 타임스탬프를 기반으로 정렬되어 있다면, 커서로는 마지막으로 조회한 레코드의 타임스탬프를 사용할 수 있습니다. 이후 요청에서는 이 타임스탬프를 커서로 사용하여 이 이후에 생성된 레코드를 가져오게 됩니다.
장점
- 성능: 커서 기반 페이징은 대량의 데이터에서 특정 위치의 데이터를 가져오는 데 있어서 훨씬 더 효율적입니다. 오프셋 기반 페이징처럼 처음부터 많은 데이터를 건너뛰지 않아도 되기 때문에 성능이 우수합니다.
- 일관성: 데이터가 동적으로 변할 때도 커서 기반 페이징은 일관성을 유지할 수 있습니다. 오프셋 기반 페이징에서는 중간에 새로운 데이터가 삽입되거나 삭제될 경우 데이터가 중복되거나 누락될 가능성이 있지만, 커서 기반 페이징은 이러한 문제를 피할 수 있습니다.
단점
- 구현 복잡성: 오프셋 기반 페이징보다 구현이 복잡할 수 있습니다. 특히 커서의 관리와 생성, 복잡한 쿼리 작성 등이 어려울 수 있습니다.
- 고유 식별자 필요: 커서로 사용할 수 있는 고유한 식별자(예: ID, 타임스탬프 등)가 필요합니다. 따라서, 이 방법은 이러한 고유 식별자가 없는 경우에는 사용하기 어렵습니다.
커서 기반 페이징 예시
예를 들어, 데이터베이스에서 생성된 날짜를 기준으로 정렬된 게시글 목록이 있다고 가정해 보겠습니다. API의 첫 번째 요청에서 최근 게시글 10개를 가져왔다면, 그 마지막 게시글의 타임스탬프를 커서로 저장합니다. 다음 API 요청 시에는 이 타임스탬프를 전달하여 이 이후에 생성된 게시글을 가져오도록 요청합니다.
1. 요청 1: GET /posts?limit=10
- 결과: [포스트 1, 포스트 2, ..., 포스트 10] (포스트 10의 타임스탬프: T10)
2. 요청 2: GET /posts?limit=10&cursor=T10
- 결과: [포스트 11, 포스트 12, ..., 포스트 20] (포스트 20의 타임스탬프: T20)
이처럼 커서 기반 페이징은 마지막으로 읽은 데이터를 기준으로 다음 데이터를 요청하는 방식으로 동작합니다. 이를 통해 많은 데이터를 효율적으로 처리할 수 있게 됩니다.
반응형