✅ TanStack Query란?
기존에 React Query로 알려졌던 라이브러리는 현재 TanStack Query라는 이름으로 발전했습니다. 단순한 데이터 fetching 라이브러리를 넘어, **서버 상태(server state)**를 효과적으로 관리하기 위한 도구로 자리 잡았습니다.
클라이언트 상태(state)와는 달리, 서버 상태는 외부 데이터 소스에 의해 변화하고, 클라이언트는 그 상태를 동기화해서 보여주기만 합니다. 즉, 서버 상태는 언제든지 바뀔 수 있기 때문에 항상 최신 상태를 유지하는 것이 중요합니다. 이 부분에서 TanStack Query가 진가를 발휘합니다.
useQuery(['posts'], fetchPosts, {
refetchOnWindowFocus: true,
refetchOnReconnect: true,
});
📌 선택적 사용 가능. 디폴트는
true, 필요 시 꺼줄 수 있습니다.
useQuery(['user'], fetchUser, {
staleTime: 0, // 즉시 stale 처리 → 백그라운드 refetch
});
stale-while-revalidate 전략과 유사한 동작 방식입니다.
const queryClient = useQueryClient();
mutationFn().then(() => {
queryClient.invalidateQueries(['posts']);
});
✅ Redux 등에서는 수동으로 상태를 직접 업데이트해야 하는 반면, TanStack Query는 간단히 쿼리 무효화만 해주면 됩니다.
const { data, isLoading, isError } = useQuery(['user'], fetchUser);
필요한 UI 조건 분기 처리를 손쉽게 구현 가능
// 여러 컴포넌트에서 동시에 요청해도 실제 호출은 1회
useQuery(['user'], fetchUser);
서버 부하를 줄이고, 클라이언트 성능도 최적화됩니다.
keepPreviousData, placeholderData, select 등을 활용하면 UX를 부드럽게 유지하면서도 서버 데이터를 자연스럽게 동기화할 수 있습니다.useQuery(['page', page], fetchPage, {
keepPreviousData: true,
});
페이지 이동 시 깜빡임 없이 자연스러운 전환 가능
useInfiniteQuery, getNextPageParam 등을 사용하면 무한스크롤을 간단히 구현할 수 있습니다.useInfiniteQuery(['comments'], fetchComments, {
getNextPageParam: (lastPage) => lastPage.nextCursor,
});
내부적으로 페이지 정보, 상태 관리를 자동 처리해줍니다.
dehydrate/rehydrate 방식으로 SSR에 최적화되어 있습니다.prefetchQuery로 데이터를 미리 받아두고, 클라이언트에서 useQuery로 불러오면 props drilling 없이 상태 공유가 가능합니다.// 서버에서
await queryClient.prefetchQuery(['posts'], fetchPosts);
// 클라이언트에서
const { data } = useQuery(['posts'], fetchPosts);
단순한 GET 요청 결과 캐싱만 생각했다면 TanStack Query의 진가를 절반도 못 본 셈입니다. 이 라이브러리는 서버 상태의 생명주기를 관리하고, 사용자 경험을 최적화하며, 개발 생산성을 높이는 도구입니다.
클라이언트 상태 관리 라이브러리(Redux, Zustand 등)와는 관점이 다릅니다.