지주 변하지 않는 데이터임에도 불구하고 계속해서 refetch 되는 것은 낭비이다.
이를 따로 설정하여 refetch를 억누를 필요가 있다.
공식문서
refetch를 설정하는 default option들이 존재한다.
필요한 상황을 판단하여 잘 사용해야 한다.
즉각적인 업데이트가 필요없는 데이터인 경우와 즉각적인 업데이트가 필요한 데이터를 구별할 필요가 있다.
나 같은 경우 즉각적인 업데이트가 필요없는 데이터인 경우가 많고 즉각적인 업데이트가 필요한 데이터가 소수였기 때문에 query들의 default option에 즉각적인 refetch를 억누르는 설정을 추가했다.
// queryClient.ts
// 즉각적인 업데이트가 필요없는 경우가 많기 때문에 default option으로 설정
export const queryClient = new QueryClient({
defaultOptions: {
queries: {
staleTime: 600000, // 10분
cacheTime: 900000, // 15분
refetchOnMount: false,
refetchOnWindowFocus: false,
refetchOnReconnect: false
}
}
})
즉각적인 업데이트가 필요한 데이터를 유저의 작업 없이 주기적으로 refetch 하려 한다.
refetchInterval이라는 useQuery 옵션을 사용하여 구현한다.
global default option으로 설정해준 값을 다시 default 값으로 재설정해주고
refetchInterval는 설정한 시간을 ms단위로 refetch해준다.
이를 Polling 통신이라고 한다.
위키에서 컴퓨터 과학에서의 "폴링(polling)이란 하나의 장치(또는 프로그램)가 충돌 회피 또는 동기화 처리 등을 목적으로 다른 장치(또는 프로그램)의 상태를 주기적으로 검사하여 일정한 조건을 만족할 때 송수신 등의 자료처리를 하는 방식"이라 정의한다.
쉽게 말하면 데이터 refetch를 위해 프로그램의 상태를 주기적으로 검사하는 행위이며, 이 작업을 refetchInterval이 해주고 있는 것이다. 예를 들어 1000ms, 즉 1초마다 polling 통신을 하고 조건이 맞으면 refetch 요청을 하는 것을 의미한다.
// 즉각적인 업데이트가 필요한 데이터인 경우
const { data : appointments = fallback} = useQuery(queryKeys, queryFn, {
staleTime: 0, // default값으로 재설정
cacheTime: 300000, // default값(5분)으로 재설정
refetchOnMount:true,
refetchOnReconnect: true,
refetchOnWindowFocus: true,
refetchInterval: 1000 // every second refetch
})