TanStack Query(React Query) 베스트 프랙티스 가이드. useQuery, useSuspenseQuery, useMutation 훅 사용, 에러 핸들링(ErrorBoundary, QueryErrorResetBoundary), Query Key Factory 패턴, Cache Invalidation 전략, SSR Prefetch 패턴 작성 시 사용. TanStack Query 관련 코드 작성이나 데이터 페칭 로직 구현 시 참조.
Version: 5.x (v5) Doc Source: Official TanStack Query documentation
Always read first: PRINCIPLES.md, PRACTICES.md
TanStack Query(React Query) v5를 사용한 데이터 페칭 구현 시 베스트 프랙티스를 적용합니다. useQuery, useSuspenseQuery, useMutation 훅 선택, 에러 핸들링, Query Key Factory 패턴, Cache Invalidation 전략, SSR Prefetch 패턴 등 TanStack Query의 핵심 패턴을 올바르게 구현하도록 안내합니다.
npm install @tanstack/react-query @tanstack/react-query-devtools react-error-boundary
| v4 (deprecated) | v5 (current) |
|---|---|
cacheTime | gcTime |
useQuery의 onSuccess, onError, onSettled 콜백 | 제거됨 → 컴포넌트/훅 레벨에서 처리 |
useMutation의 onSuccess | deprecated → onSettled 사용 |
useFormState | useActionState (React 19) |
getNextPageParam 반환 undefined | null 반환으로 마지막 페이지 표시 |
| 상황 | 훅 |
|---|---|
| 기본 데이터 조회 | useQuery |
| 조건부 데이터 조회 | useQuery + enabled |
| 선언형 데이터 조회 (Suspense) | useSuspenseQuery |
| 동적 병렬 조회 | useQueries / useSuspenseQueries |
| 무한 스크롤 / 페이지네이션 | useInfiniteQuery / useSuspenseInfiniteQuery |
| 생성 / 수정 / 삭제 | useMutation |
| SSR 프리페치 (서버) | queryClient.prefetchQuery |
| SSR 프리페치 (컴포넌트) | usePrefetchQuery |
@queries/
├── [domain]/
│ ├── keys.ts # Query Key Factory
│ ├── use[Domain]List.ts
│ ├── use[Domain]Detail.ts
│ ├── use[Domain]Create.ts
│ ├── use[Domain]Update.ts
│ └── use[Domain]Delete.ts
├── student/
│ ├── keys.ts
│ ├── useStudentList.ts
│ └── useStudentDetail.ts
└── bookmark/
├── keys.ts
└── useBookmarkList.ts
keys.ts로 Query Key Factory 배치Understanding defaults? → references/guides-and-concepts/01-important-defaults.md
staleTime, gcTime, retry 기본값Writing queries? → references/guides-and-concepts/02-queries.md
Defining query keys? → references/guides-and-concepts/03-query-keys.md
Writing query functions? → references/guides-and-concepts/04-query-functions.md
queryFn 작성, AbortSignal, 에러 처리Using query options? → references/guides-and-concepts/05-query-options.md
queryOptions 헬퍼로 타입 안전한 옵션 재사용Network mode? → references/guides-and-concepts/06-network-mode.md
online, always, offlineFirst 모드Parallel queries? → references/guides-and-concepts/07-parallel-queries.md
useQueries로 동적 병렬 실행Dependent queries? → references/guides-and-concepts/08-dependent-queries.md
enabled 옵션으로 순차 실행Background fetching indicators? → references/guides-and-concepts/09-background-fetching-indicators.md
isFetching, isRefetching 상태 표시Window focus refetching? → references/guides-and-concepts/10-window-focus-refetching.md
refetchOnWindowFocus 설정Disabling queries? → references/guides-and-concepts/11-disabling-queries.md
enabled: false, lazy query 패턴Query retries? → references/guides-and-concepts/12-query-retries.md
retry, retryDelay 커스텀 전략Paginated queries? → references/guides-and-concepts/13-paginated-queries.md
placeholderData: keepPreviousData 패턴Infinite queries? → references/guides-and-concepts/14-infinite-queries.md
useInfiniteQuery, getNextPageParamInitial query data? → references/guides-and-concepts/15-initial-query-data.md
initialData로 초기 데이터 설정Placeholder data? → references/guides-and-concepts/16-placeholder-query-data.md
placeholderData로 임시 데이터 표시Writing mutations? → references/guides-and-concepts/17-mutations.md
useMutation, onSettled, 상태 관리Query invalidation? → references/guides-and-concepts/18-query-invalidation.md
invalidateQueries 전략Invalidation from mutations? → references/guides-and-concepts/19-invalidations-from-mutations.md
Updating from mutation responses? → references/guides-and-concepts/20-updates-from-mutation-responses.md
setQueryData로 캐시 직접 업데이트Optimistic updates? → references/guides-and-concepts/21-optimistic-updates.md
Query cancellation? → references/guides-and-concepts/22-query-cancellation.md
AbortController, 쿼리 취소Scroll restoration? → references/guides-and-concepts/23-scroll-restoration.md
Filters? → references/guides-and-concepts/24-filters.md
QueryFilters, MutationFiltersPerformance & waterfalls? → references/guides-and-concepts/25-performance-request-waterfalls.md
Prefetching & router integration? → references/guides-and-concepts/26-prefetching-router-integration.md
Server rendering & hydration? → references/guides-and-concepts/27-server-rendering-hydration.md
HydrationBoundary, dehydrateAdvanced server rendering? → references/guides-and-concepts/28-advanced-server-rendering.md
Caching examples? → references/guides-and-concepts/29-caching-examples.md
Render optimizations? → references/guides-and-concepts/30-render-optimizations.md
notifyOnChangeProps, 구조적 공유Default query function? → references/guides-and-concepts/31-default-query-function.md
queryFn 설정Suspense? → references/guides-and-concepts/32-suspense.md
useSuspenseQuery, Suspense 경계Testing? → references/guides-and-concepts/33-testing.md
renderHookReplacing other libraries? → references/guides-and-concepts/34-possibility-replace.md
QueryClient methods? → references/api-reference/01-query-client.md
fetchQuery, prefetchQuery, invalidateQueries 등 31개 메서드QueryCache? → references/api-reference/02-query-cache.md
onError, onSuccessMutationCache? → references/api-reference/03-mutation-cache.md
QueryObserver? → references/api-reference/04-query-observer.md
InfiniteQueryObserver? → references/api-reference/05-infinite-query-observer.md
QueriesObserver? → references/api-reference/06-queries-observer.md
StreamedQuery? → references/api-reference/07-streamed-query.md
FocusManager? → references/api-reference/08-focus-manager.md
OnlineManager? → references/api-reference/09-online-manager.md
NotifyManager? → references/api-reference/10-notify-manager.md
TimeoutManager? → references/api-reference/11-timeout-manager.md
useQuery? → references/api-reference/12-use-query.md
useQueries? → references/api-reference/13-use-queries.md
useInfiniteQuery? → references/api-reference/14-use-infinite-query.md
useMutation? → references/api-reference/15-use-mutation.md
onSettled, onErroruseIsFetching? → references/api-reference/16-use-is-fetching.md
useIsMutating? → references/api-reference/17-use-is-mutating.md
useMutationState? → references/api-reference/18-use-mutation-state.md
useSuspenseQuery? → references/api-reference/19-use-suspense-query.md
useSuspenseInfiniteQuery? → references/api-reference/20-use-suspense-infinite-query.md
useSuspenseQueries? → references/api-reference/21-use-suspense-queries.md
QueryClientProvider? → references/api-reference/22-query-client-provider.md
useQueryClient? → references/api-reference/23-use-query-client.md
queryClient 접근queryOptions? → references/api-reference/24-query-options.md
infiniteQueryOptions? → references/api-reference/25-infinite-query-options.md
mutationOptions? → references/api-reference/26-mutation-options.md
usePrefetchQuery? → references/api-reference/27-use-prefetch-query.md
usePrefetchInfiniteQuery? → references/api-reference/28-use-prefetch-infinite-query.md
QueryErrorResetBoundary? → references/api-reference/29-query-error-reset-boundary.md
useQueryErrorResetBoundary? → references/api-reference/30-use-query-error-reset-boundary.md
Hydration? → references/api-reference/31-hydration.md
dehydrate, HydrationBoundary, SSR 통합