최근 회사에서 새로 합류하게 된 스쿼드에서 사용하고 있는 스택 중 TanStack Query를 학습하기 위한 기록입니다.
React Query는 클라이언트에서 서버 데이터 캐시를 관리한다. 리액트 코드에서 데이터가 필요할 때, fetch나 axios를 사용해 서버로 바로 접근하는 것이 아닌, React Query 캐시를 요청한다.
React Query의 역할은 리액트 쿼리 클라이언트를 어떻게 구성했냐에 따라 해당 캐시의 데이터를 유지관리하는 것이다.
캐시의 업데이트하는 시기를 설정하는 것은 사용자의 몫이다.
- imperatively(명령적): 쿼리 클라이언트에 데이터를 무효화(invalidate)하고 캐시에 교체할 새 데이터를 서버에서 가져오게 지시한다.
- declaratively(선언적): 리페치(refatch)를 트리거하는 조건을 구성. configure how & when to trigger a re-fetch.
서버 상태 관리에 도움되는 도구를 제공한다.
- 로딩과 에러 상태를 유지해준다.
용어 설명
- query client: 쿼리와 캐시를 관리하는 클라이언트. 캐시와 툴을 포함한다.
const { data } = useQuery({
queryKey: ["posts"],
queryFn: fetchPosts,
});
// 이렇게만 하면 에러 발생 왜냐면 비동기 함수라 data가 undefined이기 때문에 에러 발생
if(!data){
return <div>undefined data</div>
}
// 이렇게 작성해 두면 데이터가 없는 동안은 div를 반환하다가 data가 falsy하지 않으면, 다시 렌더링한다.
// replace with useQuery
const { data, isLoading, isError, error } = useQuery({
queryKey: ["posts"],
queryFn: fetchPosts,
});
// 이렇게만 하면 에러 발생 왜냐면 비동기 함수라 data가 undefined이기 때문에 에러 발생
if (isLoading) {
return <h2>로딩중이지롱!</h2>;
}
if (isError) {
return (
<>
<h2>에러 발생!!</h2>
<p>{error.toString()}</p>
</>
);
}
데이터가 expired 된 것을 의미한다. 그리고 refetch되는 것을 기다리는 것이다.
캐시에 아직 존재하지만 재검증(revalidate)이 필요함을 의미한다.
staleTime
-> max age
기본적으로 리액트 쿼리의 default stale time은 0ms이다. 이게 stale한 데이터가 없이 항상 fresh한 데이터를 유지하는 의미로 stale time을 생각하면 좋다.
stale time 동안은 fresh하다.
데이터를 캐시에 유지할 시간을 결정한다.
데이터가 구독되지 않으면 지정된 시간 후에 캐시에서 삭제된다. 즉, 데이터와 연관된 활성 useQuery가 없고 화면에 데이터가 표시되지 않는 순간부터 시간이 측정된다.