[Study] Pagination

조혜인·2022년 8월 19일
0
post-thumbnail

왜 자꾸 싸이의 PNation이 생각나는 거지..

📌 Pagination

  • Paging이라고도 불리는 Pagination은 문서를 전자 페이지 또는 인쇄된 페이지의 개별 페이지로 나누는 프로세스이다.(위키백과)

  • 즉, 예를 들어 Google dptj 검색을 했을 때 한 번에 보여주기에는 너무 많은 양의 데이터가 있다면 페이지를 나누고 아래 이미지와 같이 맨 아래에 페이지들을 표현해 놓은 UI요소를 Pagination이라고 한다. 페이지 단위로 데이터를 나누어 보여주고 사용자가 쉽게 원하는 부분으로 이동할 수 있도록 하는 UI패턴이다.

  • Pagination은 대표적으로 오프셋 기반 Pagination, 커서 기반 Pagination으로 나누어진다.


Offset-based Pagination(오프셋 기반)

  • DB의 offset 쿼리를 사용하여 페이지 단위로 구분하여 요청/응답하게 구현한다.
  • MySQL에서는 간단히 Limit 쿼리에 ','(콤마)를 붙어 건너 뛸 row숫자를 지정해주면 된다.
SELECT if FROM 'products' ORDER BY id DESC LIMIT 20, 40

Cursor-based Pagination(커서 기반)

  • 오프셋 기반에서는 몇 개의 row를 건너뛸지로 데이터를 가져왔다면, 커서 기반에서는 DB에서 이 row 다음부터 10개의 데이터를 주세요 와 같이 요청을 한다.

Offset-based Pagination에서의 문제점

  • 각각의 페이지를 요청하는 사이에 데이터의 변화가 있는 경우 중복 데이터가 노출된다.
  • 대부분의 RDBMS에서 OFFSET 쿼리의 퍼포먼스 이슈
    -> DB는 모든 정렬 기준에 대해 해당 row가 몇 번째 순서를 갖는지 모르기 때문에 임시로 해당 쿼리의 모든 값들을 전부 만들어놓은 후 지정된 갯수만 순회하여 자르는 방식을 사용한다. offset이 작은 수이면 괜찮을 지 몰라도 그 수가 매우 많아지면 offset 값이 커질수록 쿼리문의 퍼포먼스는 이에 비례하여 떨어진다.

찾아보니 위와 같은 문제점때문에 오프셋기반 방식보다 커서 기반의 Pagination을 사용한다고 한다.


📌 참고

profile
코딩은 역시 재밌군

0개의 댓글