본문으로 건너뛰기

[부록] 페이지네이션(Pagination)

페이지네이션은 결과를 여러 페이지로 나누어 반환하는 기술입니다. 이를 통해 클라이언트는 필요한 만큼의 결과를 받을 수 있으며, 서버 부하를 분산시키고 응답 시간을 최적화할 수 있습니다.

페이지네이션 요청 파라미터와 응답

요청 파라미터

  1. page (페이지 번호): 조회하려는 페이지의 번호입니다. 기본값은 1입니다.

  2. page_size (페이지당 결과 수): 각 페이지에 포함되는 결과의 개수입니다. 기본값은 API에서 설정한 값이나 클라이언트가 명시적으로 지정할 수 있습니다. 최대값은 10,000 건 입니다.

응답

다음은 /event/place-visit API의 일부 응답입니다.

{
"count": 200,
"next": "https://api.mash-board.io/event/place-visit?page=2",
"previous": null,
"results": [
// ... (현재 페이지의 결과)
]
}
  • count (총 결과 수): 전체 결과의 개수를 나타냅니다.

  • next (다음 페이지 링크): 다음 페이지의 결과를 가져오기 위한 링크입니다. 만약 다음 페이지가 없으면 null입니다.

  • previous (이전 페이지 링크): 이전 페이지의 결과를 가져오기 위한 링크입니다. 만약 이전 페이지가 없으면 null입니다.

페이지네이션 사용 예시

1. 첫 번째 페이지 조회

GET /event/place-visit?page=1&page_size=10

이 경우, 첫 번째 페이지에 해당하는 10개의 결과를 받을 수 있습니다.

2. 다음 페이지 조회

이전 응답의 next 링크를 사용하여 다음 페이지의 결과를 조회합니다.

GET /event/place-visit?page=2&page_size=10

이런 식으로 필요한 만큼 페이지를 이동하여 결과를 받아올 수 있습니다. 페이지네이션은 큰 데이터 세트를 다룰 때 유용하며, 클라이언트가 필요한 양의 데이터를 효율적으로 가져올 수 있도록 합니다.

전체 데이터 불러오기

이전에 작성한 MashClient에 메소드를 추가하여 페이지네이션 된 데이터를 연속적으로 호출하여 전체 데이터를 불러오는 방법을 안내합니다.

import time

class MashClient:
# (이전에 작성한 MashClient 코드...)

def get_all_data(self, endpoint, params=None, sleep_duration=1):
"""
페이지네이션을 사용하여 모든 데이터를 조회합니다.
:param endpoint: 요청할 엔드포인트
:param params: 쿼리 파라미터 (딕셔너리 형태)
:param sleep_duration: 각 페이지 조회 후 대기할 시간(초)
:return: 모든 데이터의 리스트
"""
all_results = []

# 첫 번째 페이지 조회
response = self.get_data(endpoint=endpoint, params=params)

all_results.extend(response["results"])

# 다음 페이지가 있을 경우 계속 조회
while response.get("next"):
response = self.get_data(endpoint=response["next"])

all_results.extend(response["results"])

# 일정 시간 대기
time.sleep(sleep_duration)

return all_results

# 사용 예시 (슬립 2초로 설정)
client = MashClient()
all_data = client.get_all_data(endpoint="/event/place-visit", params=params, sleep_duration=2)
print(all_data)


전체 조회 시 요청 중간 대기 시간 부여하기

슬립(대기)을 주는 이유는 다수의 API 요청을 보낼 때 서버에 부하를 줄이고, 서버의 정상적인 동작을 돕기 위한 것입니다. 특히 페이지네이션된 데이터를 모두 조회할 때, 여러 번의 요청을 동시에 보내면 서버에 과부하가 걸릴 수 있습니다. 이를 방지하고 서버에게 충분한 여유 시간을 제공하기 위해 각 페이지 조회 후 일정 시간 동안 대기합니다.

대기 시간을 적절히 설정함으로써 서버와의 효율적인 소통을 유지하면서 데이터를 안정적으로 수집할 수 있습니다. 너무 짧은 대기 시간은 서버에 부하를 주는 것이고, 너무 긴 대기 시간은 데이터 수집에 소요되는 시간을 늘릴 수 있습니다.