React Query는 서버 상태 관리에 특화된 라이브러리로, 데이터를 가져오고, 캐싱하고, 동기화하는 작업을 효율적으로 관리.
React Query 특징
React Query 예시
import { useQuery } from 'react-query';
const fetchUsers = async () => {
const res = await fetch('/api/users');
return res.json();
};
const Users = () => {
const { data, isLoading, error } = useQuery('users', fetchUsers);
if (isLoading) return <div>Loading...</div>;
if (error) return <div>Error: {error.message}</div>;
return (
<ul>
{data.map((user) => (
<li key={user.id}>{user.name}</li>
))}
</ul>
);
};
Jotai는 가벼운 전역 상태 관리 라이브러리로, 각 상태를 독립적인 "원자(atom)"로 관리.
Jotai 특징
Jotai 예시
import { atom, useAtom } from 'jotai';
// 상태 선언
const countAtom = atom(0);
const Counter = () => {
const [count, setCount] = useAtom(countAtom);
return (
<div>
<button onClick={() => setCount((c) => c - 1)}>-</button>
<span>{count}</span>
<button onClick={() => setCount((c) => c + 1)}>+</button>
</div>
);
};
React Query는 서버 상태를, Jotai는 클라이언트 상태를 관리하도록 결합할 수 있어.
예를 들어: React Query로 API 데이터를 가져오고, Jotai로 컴포넌트 간 상태 공유를 간단히 구현.
import { atom, useAtom } from 'jotai';
import { useQuery } from 'react-query';
const userAtom = atom(null);
const fetchUser = async () => {
const res = await fetch('/api/user');
return res.json();
};
const User = () => {
const { data } = useQuery('user', fetchUser);
const [, setUser] = useAtom(userAtom);
if (data) setUser(data);
return <div>User: {data?.name}</div>;
};
| 특징 | React Query | Jotai |
|---|---|---|
| 주요 목적 | 서버 상태 관리 (API 호출 데이터) | 클라이언트 상태 관리 |
| 관리 대상 | 서버에서 가져온 데이터 (REST API, GraphQL 등) | 애플리케이션 내부에서 사용되는 상태 (UI 상태, 사용자 입력 등) |
| 캐싱 지원 | 강력한 데이터 캐싱 및 동기화 기능 제공 | 캐싱 기능 없음 |
| 비동기 처리 | 데이터 페칭, 로딩 상태, 에러 처리 등을 자동으로 관리 | 비동기 상태를 커스터마이징하여 관리 가능 |
| 상태 구조화 | 데이터는 주로 API 호출 단위로 관리 | 상태를 Atom(원자) 단위로 분리해 관리 |
| 사용 난이도 | 초반 학습 필요 (API 패칭과 캐싱 로직 익숙해져야 함) | React Hooks와 유사하여 간단히 사용할 수 있음 |
| 적합한 사용 사례 | 서버와의 데이터 통신이 빈번하거나, 데이터 캐싱과 동기화가 중요한 경우 | 간단한 전역 상태 관리 또는 상태를 세밀하게 조정해야 하는 경우 |