React
React 상태 관리 라이브러리 비교 (2026년)
Zustand, Jotai, Redux Toolkit 중 어떤 것을 선택해야 할까요? 각 라이브러리의 특징과 적합한 상황을 비교합니다.
React 상태 관리는 항상 뜨거운 주제입니다. 2026년 현재 가장 많이 사용되는 라이브러리들을 비교해보겠습니다. 각각의 장단점과 적합한 상황을 알아봅니다.
상태 관리가 필요한 이유
React의 기본 상태 관리(useState, useContext)만으로는 복잡한 앱을 다루기 어렵습니다.
- props drilling: 깊은 컴포넌트 트리에서 데이터 전달이 번거롭습니다
- 전역 상태 필요: 여러 컴포넌트에서 같은 데이터에 접근해야 합니다
- 상태 동기화: 서로 다른 곳의 상태를 일관되게 유지해야 합니다
Zustand
가볍고 간단한 상태 관리 라이브러리입니다. 보일러플레이트가 거의 없습니다.
import { create } from 'zustand';
interface CartStore {
items: CartItem[];
addItem: (item: CartItem) => void;
removeItem: (id: string) => void;
clearCart: () => void;
totalPrice: () => number;
}
const useCartStore = create<CartStore>((set, get) => ({
items: [],
addItem: (item) => set((state) => ({
items: [...state.items, item]
})),
removeItem: (id) => set((state) => ({
items: state.items.filter(item => item.id !== id)
})),
clearCart: () => set({ items: [] }),
totalPrice: () => {
return get().items.reduce((sum, item) => sum + item.price, 0);
},
}));
// 컴포넌트에서 사용
function Cart() {
const items = useCartStore((state) => state.items);
const removeItem = useCartStore((state) => state.removeItem);
return (
<ul>
{items.map(item => (
<li key={item.id}>
{item.name}
<button onClick={() => removeItem(item.id)}>삭제</button>
</li>
))}
</ul>
);
}
Zustand의 장점
- 학습 곡선이 낮습니다
- 보일러플레이트가 거의 없습니다
- TypeScript 지원이 우수합니다
- 번들 크기가 작습니다 (1KB 미만)
- React 외부에서도 사용 가능합니다
적합한 상황
- 중소규모 프로젝트
- 빠른 프로토타이핑
- 간단한 전역 상태 관리
Jotai
원자(atom) 기반의 상태 관리 라이브러리입니다. Recoil과 비슷하지만 더 가볍습니다.
import { atom, useAtom } from 'jotai';
// 기본 atom
const countAtom = atom(0);
// 파생 atom
const doubleCountAtom = atom((get) => get(countAtom) * 2);
// 비동기 atom
const userAtom = atom(async () => {
const response = await fetch('/api/user');
return response.json();
});
// 쓰기 가능한 파생 atom
const countWithStorageAtom = atom(
(get) => get(countAtom),
(get, set, newValue: number) => {
set(countAtom, newValue);
localStorage.setItem('count', String(newValue));
}
);
// 컴포넌트에서 사용
function Counter() {
const [count, setCount] = useAtom(countAtom);
const [doubleCount] = useAtom(doubleCountAtom);
return (
<div>
<p>Count: {count}</p>
<p>Double: {doubleCount}</p>
<button onClick={() => setCount(c => c + 1)}>증가</button>
</div>
);
}
Jotai의 장점
- 세밀한 리렌더링 제어가 가능합니다
- 컴포넌트 단위로 상태를 분리하기 쉽습니다
- Suspense와 자연스럽게 통합됩니다
- 번들 크기가 작습니다
적합한 상황
- 복잡한 파생 상태가 많은 경우
- 성능이 중요한 대규모 앱
- 컴포넌트별로 독립적인 상태 관리가 필요한 경우
Redux Toolkit
Redux의 공식 도구 모음입니다. 기존 Redux의 복잡성을 크게 줄였습니다.
import { createSlice, configureStore } from '@reduxjs/toolkit';
import { useSelector, useDispatch } from 'react-redux';
// Slice 생성
const cartSlice = createSlice({
name: 'cart',
initialState: {
items: [] as CartItem[],
loading: false,
},
reducers: {
addItem: (state, action) => {
state.items.push(action.payload);
},
removeItem: (state, action) => {
state.items = state.items.filter(item => item.id !== action.payload);
},
},
});
// Store 설정
const store = configureStore({
reducer: {
cart: cartSlice.reducer,
},
});
type RootState = ReturnType<typeof store.getState>;
type AppDispatch = typeof store.dispatch;
// 타입이 적용된 훅
const useAppSelector = useSelector.withTypes<RootState>();
const useAppDispatch = useDispatch.withTypes<AppDispatch>();
// 컴포넌트에서 사용
function Cart() {
const items = useAppSelector((state) => state.cart.items);
const dispatch = useAppDispatch();
return (
<ul>
{items.map(item => (
<li key={item.id}>
{item.name}
<button onClick={() => dispatch(cartSlice.actions.removeItem(item.id))}>
삭제
</button>
</li>
))}
</ul>
);
}
Redux Toolkit의 장점
- 예측 가능한 상태 흐름을 제공합니다
- 강력한 DevTools로 디버깅이 쉽습니다
- 미들웨어로 기능을 확장할 수 있습니다
- 대규모 팀에서 검증된 패턴입니다
적합한 상황
- 대규모 엔터프라이즈 프로젝트
- 복잡한 비동기 로직
- 상태 변화 추적이 중요한 경우
- 팀에 Redux 경험자가 있는 경우
비교 정리
| 기준 | Zustand | Jotai | Redux Toolkit |
|---|---|---|---|
| 번들 크기 | 1KB | 2KB | 11KB |
| 학습 곡선 | 낮음 | 중간 | 중간 |
| 보일러플레이트 | 최소 | 최소 | 중간 |
| DevTools | 기본 | 기본 | 강력 |
| 미들웨어 | 간단 | 없음 | 풍부 |
선택 가이드
Zustand를 선택하세요
- 빠르게 시작하고 싶다면
- 단순한 전역 상태가 필요하다면
- 팀이 작거나 프로젝트가 작다면
Jotai를 선택하세요
- 세밀한 리렌더링 제어가 필요하다면
- 많은 파생 상태가 있다면
- atom 모델이 더 직관적으로 느껴진다면
Redux Toolkit을 선택하세요
- 대규모 프로젝트라면
- 복잡한 비동기 로직이 많다면
- 상태 추적과 디버깅이 중요하다면
마무리
2026년 현재 가장 인기 있는 선택은 Zustand입니다. 단순하면서도 충분히 강력하기 때문입니다.
하지만 프로젝트 규모와 요구사항에 따라 다른 선택이 더 적합할 수 있습니다. 작은 프로젝트로 각 라이브러리를 직접 사용해보고 결정하는 것을 추천합니다.
어떤 라이브러리를 선택하든, 상태 구조를 잘 설계하는 것이 가장 중요합니다.