더북(TheBook)

지금 구현한 방식은 refetch를 호출하는 것이기 때문에, 페이지네이션을 위해 요청한 데이터를 모두 재요청합니다. 즉, 첫 번째 페이지만 요청하는 게 아니라 만약 사용자가 세 번째 페이지까지 요청한 상태라면 세 개의 요청을 다시 하는 것이죠.

이 방식은 구현하기 쉬운 대신 불필요한 요청도 많이 하는데, 이를 최적화할 수 있는 방법이 있습니다. useInfiniteQuery는 반대 방향으로도 페이지네이션할 수 있습니다. 이는 getPreviousPageParam을 옵션 설정하여 구현할 수 있습니다.

우선 해당 기능을 사용할 수 있도록 API도 조금 변경해주겠습니다.

api/articles.ts - getArticles

export async function getArticles({
  limit = 10,
  cursor,
  prevCursor,
}: {
  limit?: number;
  cursor?: number;
  prevCursor?: number;
}) {
  const response = await client.get<Article[]>('/articles', {
    params: {
      _sort: 'id:DESC',
      _limit: limit,
      id_lt: cursor,
      id_gt: prevCursor,
    },
  });
  return response.data;
}

이 함수에 prevCursor라는 값을 넣어줬고, 이를 id_gt라는 쿼리 파라미터로 사용하도록 구현했습니다. 여기서 gt는 Greater than을 의미합니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.