web

REST API 페이징 방식

datajoy 2021. 12. 22. 00:48

Offset-Based Pagination (오프셋 기반 페이지네이션)

 

대중적으로 많이사용되는 페이징 방법.

유저가 페이지를 선택하고 이동 할 수 있는 장점이 있음.

전체 페이지 개수를 알 수 있음.

 

Request Parameter

parameter value description
page 1 조회하려는 페이지 번호를 전달
size 10 조회하려는 페이지에서 데이터의 개수
sort +empNm,-orgNm +는 ASC, -는 DESC
여러가 정렬 시 ","로 구분합니다.

Response data

{
 "content" : [
      //Response Json Data
   ],
  "page" : {
     "totalDataCnt" : 99,
     "totalPages" : 10,
     "isLastPage" : false,
     "isFirstPage" : true,
     "requestPage" : 1,
     "requestSize": 10

   }
}

 

response data description
content   리소스 조회 결과를 세팅합니다.
page   현재 페이지 상태를 세팅합니다.
  totalDataCnt 총 데이터 수 입니다.
  totalPages 총 페이지 수로 페이징처리 시 마지막 페이지 세팅 시 사용합니다.
  isLastPage 요청한 리소스가 마지막페이지인지 세팅합니다.
  isFirstPage 요청한 리소스가 첫페이지인지 세팅합니다.
  requestPage 요청한 페이지 번호
  requestSize 요청한 페이지 번호에서 데이터 수

 

이슈사항

1) 누락 데이터, 중복 데이터 발생.

페이지 요청하는 동안 데이터 변화가 있는 경우 중복데이터 발생.

페이스북이나 인스타그램과 같이 잦은 수정/생성/삭제가 반복되는 서비스에서는 비효율 방식

 

2) 성능이슈

맨 끝 번째 페이지 있는 값을 찾고 싶은 경우 full scan이 일어나 데이터 양이 많을 수록 성능이슈 존재.


Cursor-Based Pagination (커서 기반 페이지네이션)

페이스북과 같이 스크롤을 내리면 페이징되는 방식.

Offset-Based Pagination은 사용자가 원하는 데이터가 "몇 번째"에 있다는 데에 집중하고있다면,

Cursor-Based Pagination은 사용자가 원하는 데이터가 "어떤 데이터의 다음"에 집중한다.

데이터가 빈번하게 쓰기가 일어나도 조회 시 값이 누락되지않음. 

Offset-Based Pagination 이슈사항을 해결 할 수 있다.

 

Request Parameter (Twitter 방식 - 일반적으로 많이사용 됨)

parameter value description
max_id   페이징 API 응답받은 내역 중 마지막 글 번호.
글 번호 기준으로 다음 페이징을 하기 때문에
다음 페이징을 하더라도로 중복/누락이 되지 않음. 
since_id   페이징 API 응답받은 내역 중 첫 글 번호.
글 번호 기준으로 이전 페이징을 하기 때문에
이전 페이징을 하더라도로 중복/누락이 되지 않음. 
web socket, ajax polling 방식을 사용해서 일정 주기에 따라서 갱신
count   페이징 개수

 

이슈사항

정렬이 id값으로 되고있지 않는 경우 복잡해 짐.