본문 바로가기
💻 개발/주문 플랫폼

페이지네이션 방식 - offset 기반과 cursor 기반

by 컴쏘 2024. 11. 10.

 

주문 플랫폼 개발을 위해 페이지네이션 처리 방식을 결정하고자 offset 기반과 cursor 기반 페이지네이션 방식을 공부해보고자 한다. 

 

페이지네이션은 필요한 개수를 지정하고 정렬 조건에 맞춰 데이터를 가져온다. 

 

이러한 페이지네이션 방법에는 2가지가 있다. 

  1. offset 기반 
  2. cursor 기반 

 

Offset 기반 

offset 기반은 페이지네이션을 처음 구현하게 될 때 많이 접하는 일반적인 페이징 방법이다. 

SELECT * FROM [TABLE NAME]
ORDER BY created_at DESC
LIMIT 10 OFFSET 20;
  • DB의 limit, offset 쿼리를 사용하여 페이지 단위로 구분해서 요청하고 응답한다. 
    • limit : 한 번에 가져올 데이터의 수를 지정 
    • offset : 조회를 시작할 때 데이터의 위치를 지정 

이 방법의 장점은 구현이 간단하다는 것이다. 또한, 사용자가 자유롭게 페이지를 넘길 수 있다. 

 

하지만, 단점은 데이터의 양이 많아져 offset 값이 커질 경우 성능이 떨어질 수 있다. 

  • 데이터베이스는 offset 값에 도달하기 위해 모든 데이터를 스캔해야 하므로, 특정 페이지가 멀리 있을수록 쿼리 시간이 길어진다. 
    • 모든 데이터를 순차적으로 스캔해야 원하는 위치에 도달할 수 있다.
    • offset이 10,000이면 10,000개의 데이터를 지나야 10,001번째 데이터에 도달할 수 있다. 

추가적으로 offset 기반으로 조회를 했을 때, 중간에 데이터가 추가되거나 삭제되면 페이지네이션의 일관성이 떨어지는 문제도 있다고 한다.

 

Cursor 기반

특정 레코드나 데이터 포인트를 기준으로 그 이후의 데이터를 가져오는 방식이다. 

  • 이때의 특정 레코드나 데이터 포인트는 페이지네이션의 기준이 되는 고유한 위치 정보를 의미한다. (ID, 날짜/시간, ... 등 정렬 가능한 고유한 값)
  • 따라서, Cursor 기반의 Cursor는 데이터의 위치를 추적할 수 있는 식별자 역할을 한다. 
SELECT * FROM [TABLE 이름]
WHERE id > [마지막에 조회된 id]
ORDER BY id ASC 
LIMIT 10;
  • id를 기준으로 페이지네이션을 한다면 마지막으로 조회된 id를 Cursor로 삼아 이후 데이터를 계속 불러온다. 

 

이 방법의 장점은 데이터의 양이 많아도 이전 데이터를 건너뛰는 과정이 없기 때문에 속도가 빠르다. (기준점 이후의 데이터만 조회하기 때문)

또한, 데이터가 실시간으로 변동되더라도 중복이나 누락되는 데이터가 적어지며, 안정적인 페이지 이동이 가능하다.

 

Cursor 기반의 페이지네이션을 사용할 때 주의점이 있다. 

  • 정렬된 고유 값이 필요 : Cursor로 사용할 수 있는 고유한 값이 있어야 한다.
  • 뒤로 가기 제한 : Cursor는 보통 현재 페이지에서 이전 페이지로 돌아가기가 어렵다. 

 

따라서, Cursor 기반대규모 데이터와 실시간 업데이트가 빈번한 환경에서 성능과 안정성 면에서 효과적이라고 한다. 

 

 

하지만, 대규모 데이터나 실시간 업데이트가 빈번하다고 해서 무조건 Cursor 기반을 사용하는 것보다는 제공하려는 서비스가 무엇인지를 다시 생각해보고 적절하게 페이징 기법을 적용하는 것이 좋다고 생각한다.