태그
목차

쿼리 재시도

생성일: 2024-03-22

수정일: 2024-03-22

useQuery 쿼리가 실패하면, 해당 쿼리의 요청이 최대 연속 재시도 횟수(기본값은 3)에 도달하지 않았거나 재시도 허용 여부를 결정하는 함수가 제공된 경우 TanStack Query가 자동으로 쿼리를 재시도한다.

재시도는 전역 수준과 개별 쿼리 수준 모두에서 설정할 수 있다.

Note

서버에서 재시도는 서버 렌더링을 최대한 빠르게 하기 위해 기본값이 0 으로 설정된다.

import { useQuery } from '@tanstack/react-query';

// 쿼리를 특정 횟수만큼 재시도하기
const result = useQuery({
  queryKey: ['todos', 1],
  queryFn: fetchTodoListPage,
  retry: 10, // 실패한 요청을 10회 재시도한 후 오류를 표시한다.
});

Note

쿼리가 실패한 경우 처음에는 오류 내용이 failureReason 프로퍼티에 포함되며 이는 마지막 재시도 시도까지 계속된다. 예시에서는 최대 9번의 재시도가 있으므로(총 10번 시도) 처음 9번의 재시도 동안 오류 내용은 failureReason 에 포함된다. 모든 재시도 후에도 오류가 지속되면, 마지막에는 오류 내용은 error 프로퍼티에 포함된다.

즉, 오류가 발생하면 일정 횟수의 재시도가 이루어지고, 재시도 중에는 오류 정보가 failureReason에 포함되다가, 최종적으로 오류가 지속되면 error 에 포함된다.

재시도 지연

기본적으로 재시도는 요청이 실패한 직후에 바로 수행되지 않는다. 표준에 따라 각 재시도 시도에 백오프 지연이 점진적으로 적용된다.

기본 retryDelay 는 각 시도마다 두 배( 1000ms부터 시작)로 설정되지만 30초를 초과할 수 없다:

// Configure for all queries
import {
  QueryCache,
  QueryClient,
  QueryClientProvider,
} from '@tanstack/react-query';

const queryClient = new QueryClient({
  defaultOptions: {
    queries: {
      retryDelay: (attemptIndex) => Math.min(1000 * 2 ** attemptIndex, 30000),
    },
  },
});

function App() {
  return <QueryClientProvider client={queryClient}>...</QueryClientProvider>;
}

권장되지는 않지만 프로바이더 및 개별 쿼리 옵션 모두에서 retryDelay 함수/정수를 재정의할 수 있다. 함수 대신 정수로 설정하면 지연 시간은 항상 일정한 시간이 된다:

const result = useQuery({
  queryKey: ['todos'],
  queryFn: fetchTodoList,
  retryDelay: 1000, // 재시도 횟수에 관계없이 항상 1000ms를 기다렸다가 재시도한다.
});