1. 핵심 Hooks
| 함수 | 용도 | 주요 반환값 | 주요 옵션 |
|---|
| useQuery | 데이터 조회 (GET) | data, isLoading, isError, error, isFetching, refetch | queryKey, queryFn, enabled, staleTime, gcTime, retry, select |
| useMutation | 데이터 변경 (POST/PUT/DELETE) | mutate, mutateAsync, isPending, isSuccess, isError, data, reset | mutationFn, onSuccess, onError, onMutate, onSettled |
| useInfiniteQuery | 무한 스크롤/페이지네이션 | data, fetchNextPage, fetchPreviousPage, hasNextPage, hasPreviousPage, isFetchingNextPage | queryKey, queryFn, initialPageParam, getNextPageParam, getPreviousPageParam |
| useQueryClient | QueryClient 인스턴스 접근 | queryClient 객체 | – |
| useSuspenseQuery | Suspense와 함께 사용 | data (항상 존재) | useQuery와 동일 |
| useQueries | 여러 쿼리 동시 실행 | 쿼리 결과 배열 | queries 배열 |
| useIsFetching | 현재 fetching 중인 쿼리 수 | 숫자 | queryKey, filters |
| useIsMutating | 현재 mutating 중인 개수 | 숫자 | mutationKey, filters |
2. QueryClient 메서드
캐시 관리
| 메서드 | 용도 | 예시 |
|---|
| invalidateQueries | 쿼리를 stale로 만들고 리페치 | queryClient.invalidateQueries({ queryKey: ['todos'] }) |
| refetchQueries | 쿼리 즉시 리페치 | queryClient.refetchQueries({ queryKey: ['todos'] }) |
| cancelQueries | 진행 중인 쿼리 취소 | queryClient.cancelQueries({ queryKey: ['todos'] }) |
| removeQueries | 쿼리를 캐시에서 제거 | queryClient.removeQueries({ queryKey: ['todos'] }) |
| resetQueries | 쿼리를 초기 상태로 리셋 | queryClient.resetQueries({ queryKey: ['todos'] }) |
| clear | 모든 캐시 제거 | queryClient.clear() |
데이터 조회/설정
| 메서드 | 용도 | 예시 |
|---|
| getQueryData | 캐시에서 데이터 읽기 | queryClient.getQueryData(['todos']) |
| setQueryData | 캐시 데이터 직접 수정 | queryClient.setQueryData(['todos'], newData) |
| getQueryState | 쿼리 상태 가져오기 | queryClient.getQueryState(['todos']) |
| setQueryDefaults | 쿼리 기본 옵션 설정 | queryClient.setQueryDefaults(['todos'], { staleTime: 10000 }) |
| getQueriesData | 여러 쿼리 데이터 가져오기 | queryClient.getQueriesData({ queryKey: ['todos'] }) |
| setQueriesData | 여러 쿼리 데이터 설정 | queryClient.setQueriesData({ queryKey: ['todos'] }, updater) |
Prefetching
| 메서드 | 용도 | 예시 |
|---|
| prefetchQuery | 데이터 미리 가져오기 (Promise 반환) | await queryClient.prefetchQuery({ queryKey: ['todos'], queryFn }) |
| prefetchInfiniteQuery | 무한 쿼리 미리 가져오기 | await queryClient.prefetchInfiniteQuery({ queryKey, queryFn }) |
| ensureQueryData | 캐시에 없으면 fetch, 있으면 반환 | const data = await queryClient.ensureQueryData({ queryKey, queryFn }) |
3. 주요 옵션
useQuery 옵션
| 옵션 | 타입 | 기본값 | 설명 |
|---|
| queryKey | unknown[] | 필수 | 쿼리의 고유 키 |
| queryFn | () => Promise<T> | 필수 | 데이터를 가져오는 함수 |
| enabled | boolean | true | false면 쿼리 자동 실행 안 됨 |
| staleTime | number | 0 | 데이터가 fresh 상태로 유지되는 시간 (ms) |
| gcTime | number | 5분 | 캐시 보관 시간 (구 cacheTime) |
| retry | boolean | number | function | 3 | 실패 시 재시도 횟수 |
| retryDelay | number | function | 지수 증가 | 재시도 간격 |
| refetchOnMount | boolean | "always" | true | 마운트 시 리페치 여부 |
| refetchOnWindowFocus | boolean | "always" | true | 윈도우 포커스 시 리페치 |
| refetchOnReconnect | boolean | "always" | true | 재연결 시 리페치 |
| refetchInterval | number | false | false | 주기적 리페치 간격 (ms) |
| select | (data: T) => U | undefined | 데이터 변환 함수 |
| placeholderData | T | function | undefined | 로딩 중 표시할 임시 데이터 |
| initialData | T | function | undefined | 초기 데이터 (캐시에 저장됨) |
useMutation 옵션
| 옵션 | 타입 | 설명 |
|---|
| mutationFn | (variables) => Promise<T> | mutation 실행 함수 (필수) |
| mutationKey | unknown[] | mutation의 고유 키 |
| onMutate | (variables) => Promise<Context> | Context | mutation 시작 전 실행 (낙관적 업데이트) |
| onSuccess | (data, variables, context) => void | 성공 시 콜백 |
| onError | (error, variables, context) => void | 실패 시 콜백 |
| onSettled | (data, error, variables, context) => void | 성공/실패 후 항상 실행 |
| retry | boolean | number | 재시도 횟수 |
| retryDelay | number | function | 재시도 간격 |
4. 상태 플래그
useQuery 상태
| 플래그 | 타입 | 설명 |
|---|
| status | 'pending' | 'error' | 'success' | 쿼리 상태 |
| fetchStatus | 'fetching' | 'paused' | 'idle' | fetch 상태 |
| isLoading | boolean | 처음 로딩 중 (isPending && isFetching) |
| isPending | boolean | 아직 데이터가 없음 |
| isSuccess | boolean | 성공적으로 데이터 로드 |
| isError | boolean | 에러 발생 |
| isFetching | boolean | 현재 fetching 중 (백그라운드 포함) |
| isStale | boolean | 데이터가 stale 상태 |
| isPlaceholderData | boolean | placeholder 데이터 표시 중 |
useMutation 상태
| 플래그 | 타입 | 설명 |
|---|
| status | 'idle' | 'pending' | 'error' | 'success' | mutation 상태 |
| isIdle | boolean | 아직 실행 안 됨 |
| isPending | boolean | 실행 중 |
| isSuccess | boolean | 성공 |
| isError | boolean | 실패 |
| data | T | mutation 결과 데이터 |
| error | Error | 에러 객체 |
5. 유틸리티 함수
| 함수 | 용도 | 예시 |
|---|
| hashKey | queryKey를 해시로 변환 | import { hashKey } from '@tanstack/react-query' |
| matchQuery | 쿼리 매칭 | filters에서 사용 |
| matchMutation | mutation 매칭 | filters에서 사용 |
6. 필터 옵션
invalidateQueries, refetchQueries 등에서 사용:
| 필터 | 타입 | 설명 |
|---|
| queryKey | unknown[] | 특정 쿼리 키 매칭 |
| exact | boolean | 정확히 일치하는 쿼리만 |
| predicate | (query) => boolean | 커스텀 매칭 함수 |
| type | 'active' | 'inactive' | 'all' | 쿼리 타입 필터 |
| stale | boolean | stale 상태 필터 |
| fetchStatus | 'fetching' | 'paused' | 'idle' | fetch 상태 필터 |