zerovoids.dev
@tanstack/react-queryAPIs

timeoutManager

timeoutManager.setTimeoutProvider(provider: TimeoutProvider)

setTimeout/setInterval을 감싸는 전역 타이머 매니저. staleTime·gc·재시도 같은 내부 타이머가 전부 이걸 거친다.

since TanStack Query v5verified v5 · 2026-08-05
tanstack-querytimeout-managertimersinternals

무엇

timeoutManager는 TanStack Query가 내부에서 쓰는 setTimeout/setInterval을 감싸는 전역 매니저다. staleTime 판정, 가비지 컬렉션, 재시도, 스로틀링 같은 타이머 기반 동작이 전부 이걸 거친다.

import { timeoutManager } from '@tanstack/react-query'

무슨 일이 일어나나

기본은 전역 setTimeout/setInterval을 그대로 쓴다. setTimeoutProvider로 커스텀 구현을 넣으면, 그 이후 만들어지는 타이머가 전부 그 구현을 탄다. QueryClient를 만들기 전에 설정해야 앱 전체에 일관되게 적용된다. 타이머 ID는 숫자가 아니어도 되고, Symbol.toPrimitive로 숫자를 반환하는 객체면 된다.

사용법

커스텀 타이머 구현은 setTimeoutProvider로 주입한다. QueryClient를 만들기 전에 호출하는 게 중요하다.

timeout-setup.ts
import { timeoutManager, QueryClient } from '@tanstack/react-query'

timeoutManager.setTimeoutProvider({
  setTimeout: (callback, delay) => globalThis.setTimeout(callback, delay),
  clearTimeout: (id) => globalThis.clearTimeout(id),
  setInterval: (callback, delay) => globalThis.setInterval(callback, delay),
  clearInterval: (id) => globalThis.clearInterval(id),
})

export const queryClient = new QueryClient()

직접 스케줄링할 때는 setTimeout/setInterval을 그대로 쓴다.

const id = timeoutManager.setTimeout(() => console.log('실행됨'), 1000)
timeoutManager.clearTimeout(id)

실무 예시

쿼리가 수천 개로 늘어나는 대시보드류 앱에서, 타이머를 코얼레싱(coalescing)하거나 표준 setTimeout의 지연 한도(약 24일)를 넘는 지연을 지원하는 구현으로 교체하는 정도가 실사용처다. 대부분의 앱에는 해당하지 않는다.

왜 중요한가

거의 모든 앱은 기본 타이머로 충분하다. 이 매니저는 쿼리 수가 아주 많거나 표준 타이머의 한계에 부딪히는 극단적인 상황을 위한 확장 지점이다. 존재를 알아 두는 정도로 충분하고, 손댈 일은 드물다.

Reference