728x90
React Query는 서버 상태(Server State) 관리를 위한 라이브러리입니다. 보통 REST API 또는 GraphQL 등의 서버에서 데이터를 가져와 사용할 때, 캐싱, 리페치, 로딩 처리, 에러 처리 등을 효율적으로 관리할 수 있게 도와줍니다.
1. React Query란?
- useState/useEffect로 데이터 fetch 관리할 때 발생하는 반복적인 로직(로딩 상태, 에러 핸들링, 재요청 등)을 추상화해서 단순하게 만들어줍니다.
- 클라이언트 상태(useState, useReducer 등)와는 달리, 서버에 저장된 데이터를 가져오는 작업에 최적화된 도구입니다.
- 현재 이름은 TanStack Query이며 @tanstack/react-query로 설치합니다.
2. 설치
npm install @tanstack/react-query
3. 기본 사용법
1) QueryClient 설정
// main.jsx
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')).render(
<QueryClientProvider client={queryClient}>
<App />
</QueryClientProvider>
);
2) API 호출 예시
// api.js
export const fetchTodos = async () => {
const res = await fetch('https://jsonplaceholder.typicode.com/todos');
if (!res.ok) throw new Error('데이터 로드 실패');
return res.json();
};
3) 데이터 조회 컴포넌트
import { useQuery } from '@tanstack/react-query';
import { fetchTodos } from './api';
function TodoList() {
const { data, isLoading, error } = useQuery({
queryKey: ['todos'],
queryFn: fetchTodos,
});
if (isLoading) return <div>로딩 중...</div>;
if (error) return <div>에러 발생: {error.message}</div>;
return (
<ul>
{data.slice(0, 10).map((todo) => (
<li key={todo.id}>{todo.title}</li>
))}
</ul>
);
}
export default TodoList;
4. 주요 기능
| 기능 | 설명 |
| queryKey | 쿼리를 구분하는 고유 키 (캐시의 기준) |
| queryFn | 데이터를 가져오는 함수 |
| isLoading | 로딩 중 여부 |
| error | 에러 객체 |
| refetch() | 수동으로 다시 요청 가능 |
| staleTime | 캐시된 데이터가 유효한 시간 설정 |
| enabled | 조건이 참일 때만 fetch하도록 설정 가능 |
5. 기타 기능
- useMutation : POST, PUT, DELETE 같은 데이터 변경 작업에 사용
- invalidateQueries : 데이터 변경 후 특정 쿼리를 무효화해서 다시 불러오게 함
- devtools : React Query 개발자 도구 지원
npm install @tanstack/react-query-devtools728x90
'React' 카테고리의 다른 글
| TanStack Table (0) | 2025.05.13 |
|---|---|
| 라우트 가드(Route Guard) (0) | 2025.05.13 |
| 코드 스플리팅(Code Splitting) (0) | 2025.05.11 |
| 중첩 라우팅(Nested Routing) (0) | 2025.05.11 |
| react-router-dom (0) | 2025.05.11 |