폴링
refetchInterval은 타이머에 따라 쿼리를 다시 가져오게 합니다. 밀리초 단위의 숫자로 설정하면 활성 observer가 하나 이상 있는 동안 쿼리가 N ms마다 실행됩니다:
useQuery({
queryKey: ['prices'],
queryFn: fetchPrices,
refetchInterval: 5_000, // every 5 seconds
})
폴링은 staleTime과 독립적입니다. 쿼리가 fresh 상태여도 일정에 따라 폴링할 수 있습니다. staleTime이 다른 다시 가져오기 동작과 상호작용하는 방식은 중요한 기본값을 참조하세요. refetchInterval은 freshness와 관계없이 자체 주기에 따라 실행됩니다.
쿼리 상태에 맞게 간격 조정하기
현재 쿼리에서 간격을 계산하려면 숫자 대신 함수를 전달합니다. 함수는 Query 객체를 받고 ms 단위의 숫자 또는 폴링을 중지하려면 false를 반환해야 합니다:
useQuery({
queryKey: ['job', jobId],
queryFn: () => fetchJobStatus(jobId),
refetchInterval: (query) => {
// Stop polling once the job finishes
if (query.state.data?.status === 'complete') return false
return 2_000
},
})
false를 반환하면 인터벌 타이머가 해제됩니다. 쿼리 결과가 변경되어 함수가 다시 양수를 반환하게 되면 폴링이 자동으로 재개됩니다.
백그라운드 폴링
기본적으로 브라우저 탭이 포커스를 잃으면 폴링이 일시 중지됩니다. 사용자가 다른 탭에 있는 동안에도 데이터를 최신 상태로 유지해야 하는 대시보드나 기타 인터페이스에서는 이 동작을 비활성화합니다:
useQuery({
queryKey: ['portfolio'],
queryFn: fetchPortfolio,
refetchInterval: 30_000,
refetchIntervalInBackground: true,
})
폴링 일시 중지
폴링 실행 시점을 제어하려면 refetchInterval에 함수를 전달하고 컴포넌트 상태를 클로저로 캡처합니다:
useQuery({
queryKey: ['prices', tokenAddress],
queryFn: () => fetchPrice(tokenAddress),
refetchInterval: () => {
if (!tokenAddress || isPaused) return false
return 15_000
},
})
오프라인 지원을 통한 폴링
TanStack Query는 브라우저의 online 및 offline 이벤트를 수신하여 연결 상태를 감지합니다. 이러한 이벤트가 안정적으로 발생하지 않는 환경(Electron, 일부 임베디드 WebViews)에서는 연결 상태 확인을 건너뛰도록 networkMode: 'always'를 설정합니다:
useQuery({
queryKey: ['chainStatus'],
queryFn: fetchChainStatus,
refetchInterval: 10_000,
networkMode: 'always',
})
네트워크 모드에 대한 자세한 내용은 네트워크 모드를 참조하세요.
중복 제거에 관한 참고 사항
각 QueryObserver(refetchInterval과 함께 useQuery를 사용하는 각 컴포넌트)은 자체 타이머를 실행합니다. refetchInterval: 5000를 사용하여 동일한 키를 구독하는 두 컴포넌트는 각각 5초마다 타이머를 작동시킵니다. 중복 제거되는 것은 동시에 진행 중인 가져오기입니다. 두 타이머가 동시에 작동하면 네트워크 요청은 하나만 전송됩니다. 타이머는 observer 수준이고, 중복 제거는 쿼리 수준입니다.
브라우저가 아닌 환경
React Native 같은 비브라우저 런타임에서는 표준 online/offline 및 포커스 이벤트를 사용할 수 없습니다. React Native 가이드에서는 focusManager 및 onlineManager를 네이티브 앱 상태 API에 연결하는 방법을 다룹니다.