// 브라우저 새로고침 전, 내부적으로 이런 형태로 캐싱 처리를 진행한다.
QueryCache: Map {
"['todo']" => Query { data: [...], dataUpdateAt: 1234567890 }
}
// 하지만 인메모리 캐시를 사용하면서 새로고침 시에 런타임이 초기화되고, 모든 캐시는 손실된다.
QueryCache: Map {} // (비어있음)// 1. 쿼리 생성 시
const query = queryCache.build(client, {
queryKey: ['todos'],
queryFn: fetchTodos
});
// 2. TanStack Query가 내부적으로 queryFn을 실행
const result = await query.options.queryFn();
// 3. 데이터 저장
query.state = {
data: result,
dataUpdatedAt: Date.now();
status: 'success'
}
// 4. staleTime 경과 확인
const isStale = Date.now() - query.state.dataUpdatedAt > query.options.staleTime
// 5. gcTime 경과 시에 제거
if (query.observers.length === 0) {
setTimeout(() => {
queryCache.remove(query);
}, query.options.gcTime)
}QueryClient
└─ QueryCache (Map)
├─ Query['todos']
│ ├─ state: { data, dataUpdatedAt, status }
│ ├─ observers: [Observer1, Observer2]
│ └─ options: { staleTime, gcTime }
│
└─ Query['user', 1]
├─ state: { data, dataUpdatedAt, status }
├─ observers: []
└─ options: { staleTime, gcTime }import { QueryClient, VueQueryPlugin } from '@tanstack/vue-query';
import { persistQueryClient } from '@tanstack/query-persist-client-core';
import { createSyncStoragePersister } from '@tanstack/query-sync-storage-persister';
// main.js
const queryClient = new QueryClient({
defaultOptions: {
queries: {
staleTime: 1000 * 30 // 30sec
gcTime: 1000 * 60 // 60sec
}
}
});
persistQueryClient({
queryClient,
persister: createSyncStoragePersister({ storage: window.localStorage }),
});
...
app.use(VueQueryPlugin, { queryClient });