아래의 사진은 TanStack Query의 공식 문서 설명이다.
한글 말로 간단하게 정리하면 다음과 같다.
TanStack-Query는 React 에서
서버 상태 가져오기
,캐싱
,동기화 및 업데이트
를 매우 간편하게 만들어주는 라이브러리이다.
주요 기능들을 하나씩 알아보겠다.
TanStack-Query는 API 요청 결과를 캐싱한다.
캐싱이란 데이터나 계산 결과를 임시로 저장하여 나중에 동일한 요청이나 계산이 발생했을 때 더 빠르게 응답하거나 처리하는 기술이다.
TanStack-Query는 미리 캐싱된 데이터를 보여줌으로써 응답 시간이 감소하고 서버 리소스를 절약할 수 있다.
그렇게 되면 새로운 데이터는 언제 바꿔줄건데?
위와 같은 의문점이 생긴다.
결국 캐싱된 데이터를 끝까지 잡고 있다면 사용자는 1년이 지나도 같은 화면을 보게 될 것이다.
그렇다면 데이터 갱신을 react-query가 어떻게 처리하는지 알아보자.
const { data } = useQuery('exampleQueryKey', fetchData, {
refetchInterval: 5000, // 5초마다 갱신
});
useQuery 함수의 3번째 인자의 옵션으로 refetchInterval을 설정하면 해당 주기마다 데이터를 자동으로 갱신해준다.
수동으로 데이터를 갱신하고 싶을 때에 queryClient.invalidQueries 함수를 사용하여 해당 쿼리를 갱신할 수 있다.
TanStack-Query는 useQuery 함수의 3번째 인자의 옵션으로 staleTime과 gcTime을 설정함으로써 데이터 갱신 관리를 할 수 있다.
staleTime
은 캐시된 데이터가 stale
상태로 유지되는 시간을 나타냅니다.gcTime
은 가비지 컬렉션 주기를 나타냅니다.gcTime
은 사용하지 않는 데이터를 정리하는 주기를 나타냅니다. 이는 캐시된 데이터가 아닌 사용하지 않는 데이터를 정리하는 역할입니다.TanStack-Query의 라이프 사이클
1. A 쿼리 mount
2. 데이터 fetching 후 A 쿼리 캐싱
3. 해당 데이터는 fresh 상태에서 staleTime 이후 stale 상태로 변경
4. A 쿼리 unmount
5-1. 캐싱된 데이터는 gcTime 이후 가비지 컬렉션 발생
5-2. 만일 gcTime이 지나기 전에 A 쿼리가 mount 되면, fetch가 실행되고 새로운 값을 가져오는 동안 캐싱된 데이터를 보여줌
const { data } = useQuery('exampleQueryKey', fetchData, {
staleTime: 10000, // 10초 동안 stale 상태로 유지
cacheTime: 60000, // 1분 동안 캐시된 데이터 유지
});
서버 데이터를 클라이언트 데이터와 분리함으로써 전체 애플리케이션의 데이터 관리를 더 효율적으로 구조화, 유지 보수하기 용이하다.
데이터 fetching을 위해 흔히 사용하는 방식 중 하나는 useState와 useEffect를 활용하는 방식이다.
const [questionListData, setQuestionListData] = useState();
const getQuestionListData = async () => {
const { questions, totalPage } = await getQuestionList({
page: page,
title: searchQuery,
});
setQuestionListData(questions);
};
useEffect(() => {
getQuestionListData();
}, [searchQuery, page]);
useQuery 함수를 사용하여 불필요한 boilerplate 코드를 줄이고, 코드를 간소화 할 수 있다.
const getQuestionListData = async () => {
return await getQuestionList({ page: page, title: searchQuery });
};
const { data: questionListData } = useQuery({
queryKey: ['questionList', searchQuery, page],
queryFn: getQuestionListData,
placeholderData: keepPreviousData,
});
npm i @tanstack/react-query
// app.tsx
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
const queryClient = new QueryClient();
const App = () => {
return(
<QueryClientProvider client={queryClient}>
...
</QueryClientProvider>
)
};
위와 같이 패키지 설치 후, QueryClientProvider로 전체를 감싸주면 된다.
데이터를 가져오고 캐시에 저장된 데이터를 반환하거나 새로운 데이터를 요청한다.
Parameter
queryKey
(배열)
쿼리를 식별하는 unique한 키값. 이 키는 캐시에 사용된다.
queryFn
(함수)
데이터를 가져오는 비동기 함수.
options
쿼리의 추가적인 설정을 담은 객체.
useQuery 예시
const fetchDataFunction = async () => { const response = await fetch('https://api.example.com/data'); const data = await response.json(); return data; }; const { data } = useQuery({queryKey: ['myQueryKey'], queryFn: fetchDataFunction);
데이터를 업데이트하고, 성공 또는 실패에 따른 상태를 관리한다.
Parameter
queryFn
데이터를 업데이트하는 비동기 함수.
options
쿼리의 추가적인 설정을 담은 객체.
useMutation 예시
const updateDataFunction = async () => { const response = await fetch('https://api.example.com/update', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(newData), }); const updatedData = await response.json(); return updatedData; }; const { data, mutate } = useMutation({mutationFn: updateDataFunction});
게시글에 정보를 받아오는 queryKey가 questionList인 쿼리가 있다고 가정하자.
예를 들어, 게시글을 작성한 후에는 questionList
쿼리에 대한 데이터가 변경될 것이지만, 기본적으로 React Query는 캐시를 사용하여 데이터를 제공하므로 이전의 데이터가 유지될 수 있습니다. 따라서 해당 쿼리를 무효화하고, 해당 쿼리를 다시 실행하여 새로운 데이터를 가져오게 함으로써 UI를 갱신해야한다.
queryClient.invalidateQueries(['questionList'])
위의 코드를 통해 key값이 questionList인 쿼리를 무효화 할 수 있다.
Overview | TanStack Query Docs
[React] react-query, 리액트 쿼리를 사용해야 하는 이유
[React-Query] React-Query 개념잡기
[React] TanStack Query v4 (React Query)