React Query는 React 애플리케이션에서 서버 상태를 관리하는 데 매우 유용한 라이브러리입니다. API 호출, 캐싱, 비동기 데이터 처리 등을 간편하게 처리할 수 있도록 도와주며, 복잡한 상태 관리를 단순화해줍니다. 이번 포스트에서는 React Query를 사용하여 API 데이터를 관리하고 상태를 처리하는 방법을 살펴보겠습니다.
React Query 설치
React Query를 프로젝트에 설치하기 위해 npm 또는 yarn을 사용할 수 있습니다. 아래의 명령어를 통해 설치합니다.
npm install @tanstack/react-query
혹은
yarn add @tanstack/react-query
React Query Provider 설정
React Query를 사용하기 위해서는 먼저 QueryClient와 QueryClientProvider로 애플리케이션을 감싸주어야 합니다. 아래는 기본적인 설정 예제입니다.
import React from 'react';
import ReactDOM from 'react-dom';
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import App from './App';
const queryClient = new QueryClient();
ReactDOM.render(
<QueryClientProvider client={queryClient}>
<App />
</QueryClientProvider>,
document.getElementById('root')
);
API 호출 및 데이터 가져오기
이제 React Query를 사용하여 API에서 데이터를 가져오는 방법을 살펴보겠습니다. 아래 예제에서는 JSONPlaceholder API를 사용하여 사용자 정보를 가져오는 방법을 보여줍니다.
import React from 'react';
import { useQuery } from '@tanstack/react-query';
const fetchUsers = async () => {
const response = await fetch('https://jsonplaceholder.typicode.com/users');
if (!response.ok) {
throw new Error('Network response was not ok');
}
return response.json();
};
const UsersList = () => {
const { data, error, isLoading } = useQuery(['users'], fetchUsers);
if (isLoading) return <div>Loading...</div>;
if (error) return <div>An error occurred: {error.message}</div>;
return (
<ul>
{data.map(user => (
<li key={user.id}>{user.name}</li>
))}
</ul>
);
};
export default UsersList;
위 코드에서 useQuery 훅은 세 가지 상태 (data, error, isLoading)를 반환합니다. 이 상태를 사용해 로딩 중, 에러 발생 시, 데이터를 성공적으로 가져왔을 때의 UI를 구성할 수 있습니다.
데이터 캐싱 및 자동 리패칭
React Query는 기본적으로 데이터를 캐싱하고, 데이터가 업데이트될 때 자동으로 다시 패칭합니다. 이를 통해 비동기 데이터의 일관성을 유지할 수 있습니다. useQuery 훅은 두 번째 인자로 옵션 객체를 받을 수 있습니다.
const { data, error, isLoading } = useQuery(['users'], fetchUsers, {
staleTime: 1000 60 5, // 5분 동안 데이터 캐시
refetchOnWindowFocus: true, // 창 포커스 시 데이터 자동 리패칭
});
위와 같은 설정은 데이터가 일정 시간 동안 신선하게 유지되도록 하며, 사용자가 창에 다시 포커스를 맞출 때 자동으로 데이터를 업데이트합니다.
데이터 뮤테이션
API를 통해 데이터를 수정하거나 추가하는 작업은 useMutation 훅을 사용하여 처리합니다. 아래 예제는 새로운 사용자 추가를 구현한 것입니다.
import { useMutation } from '@tanstack/react-query';
const addUser = async (newUser) => {
const response = await fetch('https://jsonplaceholder.typicode.com/users', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(newUser),
});
if (!response.ok) {
throw new Error('Network response was not ok');
}
return response.json();
};
const AddUser = () => {
const mutation = useMutation(addUser, {
onSuccess: () => {
// 성공하면 사용자 목록을 리패칭하거나 알림을 표시
},
});
const handleSubmit = (e) => {
e.preventDefault();
const newUser = { name: 'New User' }; // 사용자 데이터
mutation.mutate(newUser);
};
return (
<form onSubmit={handleSubmit}>
<button type="submit">Add User</button>
</form>
);
};
useMutation 훅은 데이터 추가, 수정, 삭제 등의 작업을 간편하게 처리할 수 있습니다. onSuccess 콜백을 사용하여 성공적인 요청 후 추가 작업을 수행할 수 있습니다.
마무리
이번 포스트에서는 React Query를 사용하여 API 데이터 관리 및 상태 처리를 수행하는 방법에 대해 알아보았습니다. React Query는 비동기 데이터 처리에 필요한 많은 기능을 제공하여, 복잡한 상태 관리에서 벗어나 애플리케이션을 더 간결하고 효율적으로 만들 수 있도록 도와줍니다. 다양한 옵션을 활용하여 자신의 요구에 맞는 데이터 관리를 구현해보시기 바랍니다.