공식문서에 의하면, React-query(이하 RQ)는 데이터 fetching라이브러리이고, 기술적으로는 fetching, 캐싱, 서버의 상태를 동기화하고 업데이트하는 라이브러리라고 한다.
쉽게 이야기하면, BE서버와의 통신하는 기능을 담당해주는 라이브러리라고 보면 된다.
개인적으로는 반복적인 서버 Api코드를 줄일 수 있고, 캐싱기능 때문에 RQ를 사용하고 있다. 🤭
RQ의 핵심 중에 하나가 바로 캐싱이고, staleTime과 cacheTime 모두 RQ의 캐싱 기능 때문에 필요한 값들이다.
그래서 RQ의 캐싱의 동작에 대해서 한번 짚고 넘어가도록 하겠다.
참고로 공식문서가 매우 잘되어 있고, 한번쯤은 읽어보는 것을 RQ팀에서도 권장하므로, 안읽어본 사람들은 한번 읽어보자 🔥
캐싱을 이해하려면 먼저, RQ에서 데이터를 관리할 때 어떤 라이프 사이클로 관리하는 지 이해할 필요가 있다.
React-query devtools를 쓰면 오른쪽에 이렇게 상태값이 나와 있는 게 있는데, 이것이 바로 데이터들의 생애주기에 대한 값들이다.
이제 본격적으로 캐싱이 어떻게 동작하는 지 알아보자.
크게 2가지 원리를 기억하면 된다.
staleTime
이다.기본적인 개념들을 알아봤는데, 좀 더 실제적인 이야기들을 해보겠다.
React query의 staleTime과 cacheTime의 기본 값은 각각 0초와 5분이다.
다시말하자면, 서버에서 가져오는 데이터는 바로 stale한 상태가 되는 것이다. 결국엔 어떠한 데이터든 요청할 때 마다 새로운 데이터를 가져오는 것이여서 캐싱 기능이 동작하지 않는 것과 다름 없다.
만약 어떤 데이터는 무조건 서버에서 새로 가져와야하는 데이터가 있다면, 이렇게 enabled
를 false
로 해주고, 필요할 때마다 직접 refetch
메서드를 실행해주자.
staleTime과 cacheTime을 설정하는 데에 있어서 사실 정답은 없다. 각자가 만드는 서비스나 쿼리의 성격에 맞게 설정해주면 된다.
하지만, 범용적으로 괜찮게 적용할 수 있는 staleTime과 cacheTime이 알고 싶을 수 있다. (내 얘기다 🤭)
찾아보니 잘 모르겠지만 일단 캐싱을 적용하고 싶다면, staleTime은 20초 cacheTime은 5분으로 설정하라고 하는 글들이 많이 있었다. ㅎㅎ
이렇게 설정해놓고 개발하면서 조정해나가면 될 것 같다.
그렇지 않다.
cacheTime을 staleTime보다 크게 설정하는 게 일반적이긴 하지만, 작게 설정한다고 문제가 되는 것은 없다.
다만, 위에서 이야기했던 서버에서 fresh한 데이터를 가져오는 동안엔 캐시된 데이터를 보여준다
라는 기능을 사용하지 않게 되는 것이다.
import {QueryClient} from 'react-query';
export const queryClient = new QueryClient({
defaultOptions: {
queries: {
retry: 0,
useErrorBoundary: true,
staleTime: 1000 * 20,
cacheTime: 1000 * 60 * 5,
},
mutations: {
useErrorBoundary: true,
},
},
});
마지막으로 내가 사용하고 있는 RQ설정을 공유하고 마치도록 하겠다.
공유하는 이유는 그냥 참고용으로? 🤭
아! 그리고 RQ에 대한 아주 좋은 내용의 무료 강의를 공유하겠다.