react-query는 서버 상태 가져오기, 캐싱, 동기화 및 업데이트를 쉽게 다룰 수 있도록 도와주는 라이브러리이다.
react-query는 크라이언트 상태 작업에는 적합하지만, 비동기 또는 서버 상태 작업에는 그다지 좋지 않다고 말한다.
gcTime이 5분이고 staleTime이 0일때
staleTime
fresh 상태에서 stale 상태까지의 기간을 말한다.
query가 fresh하다면 오직 캐시 데이터만 읽어 올 것이고 네트워크 요청은 일어나지 않는다. 만약 stale 상태이면은 기존의 캐시 데이터를 가지지만 백그라운드에서 refetch가 일어나 새로운 네트워크 요청을 하게 된다.
주의
만약 staleTime에 지나도 네트워크 요청이 즉각 일어나는 것은 아니다. staleTime은 캐시 되어있는 데이터가 더 이상 fresh하지 않아서 백그라운드에서 재요청이 필요하다는 정보만 알려준다. 실제로 백그라운드에서 refresh가 발생하려면 trigger의 조건을 충족해야한다. trigger가 일어나는 조건은 다음과 같다.
gcTime
inactive 상태인 쿼리가 캐시에서 지워지기까지의 기간을 말한다. 기본값은 5분이다.
inactive의 상태가 되려면 같은 쿼리키를 가진 인스턴스를 사용하는 모든 컴포넌트가 언마운트 되어야한다.
const { data } = useQuery(['my-data'], fetchMyData, {
staleTime: 20 * (60 * 1000), // 20 분
gcTime: 15 * (60 * 1000), // 15 분
});
위의 쿼리 인스턴스를 사용하는 모든 컴포넌트가 언마운트되면 gcTime이 시작된다. 그리고 16분뒤에 다시 쿼리인스턴스가 마운트되면 staleTime은 아직 안지났기 때문에 캐싱된 데이터를 사용하면 된다. 하지만 캐싱 데이터는 이미 사라져 있으므로 백그라운드에서 네트워크 재요청이 일어난다. 그 시간동안 로딩 상태가 일어난다. 기본적으로 staleTime을 사용하려는 이유는 불필요한 네트워크 요청을 줄이고 캐싱된 데이터를 사용하는 것인데 만약 staleTime이 gcTime보다 길면 그 취지에 맞지 않다고 생각해 그렇게 좋은 방법인지는 잘 모르겠다.
https://ttaerrim.tistory.com/53
https://stackoverflow.com/questions/75211088/if-staletime-is-bigger-than-cachetime-in-react-query-what-happen
https://github.com/ssi02014/react-query-tutorial?tab=readme-ov-file
https://tanstack.com/query/v5/docs/framework/react/guides/caching