useQuery는 비동기 데이터(fetching)를 관리하는 훅으로 API 요청을 단순화하고 캐싱, 로딩/에러 상태 관리까지 자동으로 처리해준다.
기존에는 useEffect와 useState의 조합으로 데이터를 불러왔지만 useQuery만 있으면 훨씬 깔끔하게 구현이 가능하다.
useQuery를 사용하기 위해서는 우선 TanStack Query를 설치해야 한다.
npm install @tanstack/react-query
그 후 QueryClientProvider로 앱을 감싸준다.
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import ReactDOM from "react-dom/client";
import App from "./App";
const queryClient = new QueryClient();
ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render(
<QueryClientProvider client={queryClient}>
<App />
</QueryClientProvider>
);
다음은 카테고리 목록을 호출하기 위한 useQuery 예시이다.
import { useQuery } from "@tanstack/react-query";
import { categoryService } from "@/services/categoryService";
import { Category } from "@/types/category";
export const useCategories = () => {
return useQuery<Category[]>({
queryKey: ["categories"],
queryFn: () => categoryService.getCategories(),
staleTime: 1000 * 60 * 60 * 24, // 24시간
gcTime: 1000 * 60 * 60 * 24 * 7, // 7일
refetchOnWindowFocus: false,
});
};
useQuery에는 몇가지 주요 옵션들이 존재한다.
이렇게 만든 useCategories 훅을 컴포넌트에서 사용하면 다음과 같다.
import React from "react";
import { useCategories } from "@/hooks/useCategories";
export default function CategoryList() {
const { data, isLoading, error } = useCategories();
if (isLoading) return <p>카테고리를 불러오는 중입니다.</p>;
if (error) return <p>데이터를 불러오는 데 실패했습니다.</p>;
return (
<ul>
{data?.map((category) => (
<li key={category.id}>{category.name}</li>
))}
</ul>
);
}
useQuery를 호출 시 data, isLoading, error 상태를 얻을 수 있다. 그 후 각각의 상태에 따라 렌더링을 처리한다.
useQuery는 서버 데이터 관리의 복잡성을 크게 줄여준다. 단순히 데이터를 가져오는 것 뿐만 아니라 캐싱, 로딩/에러 상태 관리, 자동 리페치까지 지원하기 때문에 적절히 사용하면 개발 생산성을 크게 높일 수 있다.
