React Query의 invalidation, caching, synchronization 동작 방식
오래된 데이터를 무효화하기 위해선 Querty Invalidation를 사용할 수 있습니다.
간단히 query client를 통해 invalidateQueries({key}) 메서드를 호출하면 됩니다.
이때 fetch 할 때 지정한 key를 가진 state는 stale 취급되고 refetch 됩니다.
// key 존재할 때
queryClient.invalidateQueries('todos');
// key 존재하지 않을 때
queryClient.invalidateQueries();
RFC 5861의 Cache-Control: max-age=600, stale-while-revalidate=30
의미는 다음과 같습니다.
캐시 데이터를 600초 동안 유효하다고 보고, 600초가 지난 630초 까지는 최신 데이터가 올 때까지(백그라운드에서 refetch 될 때까지) stale 데이터를 보여주겠다.
React Query는 이 컨셉을 이용해 메모리 캐시에도 적용합니다. 다음 옵션들은 Caching, Synchronization 과 관련 있는 useQuery의 option들입니다.
Caching options
Synchronization options (default 모두 true)
아래의 흐름은 delete 되기 전에 inactive 상태였다가 active 됐을 때 상태의 흐름입니다. 즉 컴포넌트가 다시 mount 되거나(refethchMount), window 포커싱이 되거나(refetchOnWindowFocus), 다시 연결되는 경우(refetchOnReconnect)를 말합니다. 이 경우는 refetch 되므로 fetching, fresh, stale 상태가 반복되게 됩니다.
1. fetching 상태
data fetching 한 시점
2. fresh 상태
data fetch 후 staleTime이 지나지 않은 data 일 때의 상태
3. stale 상태
data fetch 후 staleTime이 지난 data 일 때 상태
function Example(){
const { data } = useQuery('todos', ()=> fetchTodos());
}
위의 코드는 모든 options가 default므로 다음과 같은 값을 가집니다.
cacheTime: 5분
staleTime: 0
refetchMount: true
refetchOnWindowFocus: true
refetchOnReconnect: true
따라서 fetch 되는 todos data는 다음과 같은 흐름으로 상태가 변합니다.
1. staleTime이 0이므로 fetch 됨과 동시에 stale 데이터가 된다. (항상 stale data)
2. 이 상태로 5분이 지나기 전까지 (cacheTime가 만료되기 전까지) 메모리에 캐시 데이터가 남는다.
- 5분이 지나면 GC에 의해 제거된다.
3. 제거되기 전 mount, focus, reconnect가 되면 refetch가 되고 동시에 stale 데이터가 된다.
4. 1,2,3,4 과정 반복