---
name: state-management
description: Implement state management patterns for frontend applications. Use when managing global state, handling complex data flows, or coordinating state across components. Handles React Context, Redux, Zustand, Recoil, and state management best practices.
tags: [state-management, React, Redux, Context, Zustand, Recoil, global-state]
platforms: [Claude, ChatGPT, Gemini]
---
# State Management
## When to use this skill
- **전역 상태 필요**: 여러 컴포넌트가 같은 데이터 공유
- **Props Drilling 문제**: 5단계 이상 props 전달
- **복잡한 상태 로직**: 인증, 장바구니, 테마 등
- **상태 동기화**: 서버 데이터와 클라이언트 상태 동기화
## Instructions
### Step 1: 상태 범위 결정
로컬 vs 전역 상태를 구분합니다.
**판단 기준**:
- **로컬 상태**: 단일 컴포넌트에서만 사용
- 폼 입력값, 토글 상태, 드롭다운 열림/닫힘
- `useState`, `useReducer` 사용
- **전역 상태**: 여러 컴포넌트에서 공유
- 사용자 인증, 장바구니, 테마, 언어 설정
- Context API, Redux, Zustand 사용
**예시**:
```tsx
// ✅ 로컬 상태 (단일 컴포넌트)
function SearchBox() {
const [query, setQuery] = useState('');
const [isOpen, setIsOpen] = useState(false);
return (
);
}
```
### Step 5: 서버 상태 관리 (React Query / TanStack Query)
API 데이터 fetching 및 캐싱에 특화되어 있습니다.
```tsx
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
function UserProfile({ userId }: { userId: string }) {
const queryClient = useQueryClient();
// GET: 사용자 정보 조회
const { data: user, isLoading, error } = useQuery({
queryKey: ['user', userId],
queryFn: async () => {
const res = await fetch(`/api/users/${userId}`);
return res.json();
},
staleTime: 5 * 60 * 1000, // 5분간 캐시
});
// POST: 사용자 정보 수정
const mutation = useMutation({
mutationFn: async (updatedUser: Partial) => {
const res = await fetch(`/api/users/${userId}`, {
method: 'PATCH',
body: JSON.stringify(updatedUser)
});
return res.json();
},
onSuccess: () => {
// 캐시 무효화 및 재조회
queryClient.invalidateQueries({ queryKey: ['user', userId] });
}
});
if (isLoading) return
Loading...
;
if (error) return
Error: {error.message}
;
return (
{user.name}
{user.email}
);
}
```
## Output format
### 상태 관리 도구 선택 가이드
```
상황별 추천 도구:
1. 간단한 전역 상태 (테마, 언어)
→ React Context API
2. 중간 복잡도 (장바구니, 사용자 설정)
→ Zustand
3. 대규모 앱, 복잡한 로직, 미들웨어 필요
→ Redux Toolkit
4. 서버 데이터 fetching/caching
→ React Query (TanStack Query)
5. 폼 상태
→ React Hook Form + Zod
```
## Constraints
### 필수 규칙 (MUST)
1. **상태 불변성**: 상태는 절대 직접 수정하지 않음
```tsx
// ❌ 나쁜 예
state.items.push(newItem);
// ✅ 좋은 예
setState({ items: [...state.items, newItem] });
```
2. **최소 상태 원칙**: 파생 가능한 값은 상태로 저장하지 않음
```tsx
// ❌ 나쁜 예
const [items, setItems] = useState([]);
const [count, setCount] = useState(0); // items.length로 계산 가능
// ✅ 좋은 예
const [items, setItems] = useState([]);
const count = items.length; // 파생 값
```
3. **단일 진실의 원천**: 같은 데이터를 여러 곳에 중복 저장 금지
### 금지 사항 (MUST NOT)
1. **Props Drilling 과다**: 5단계 이상 props 전달 금지
- Context 또는 상태 관리 라이브러리 사용
2. **모든 것을 전역 상태로**: 로컬 상태로 충분한 경우 전역 상태 사용 지양
## Best practices
1. **선택적 구독**: 필요한 상태만 구독
```tsx
// ✅ 좋은 예: 필요한 것만
const items = useCartStore(state => state.items);
// ❌ 나쁜 예: 전체 구독
const { items, addItem, removeItem, updateQuantity, clearCart } = useCartStore();
```
2. **액션 이름 명확히**: `update` → `updateUserProfile`
3. **TypeScript 사용**: 타입 안정성 확보
## References
- [Zustand](https://zustand-demo.pmnd.rs/)
- [Redux Toolkit](https://redux-toolkit.js.org/)
- [React Query](https://tanstack.com/query/latest)
- [Jotai](https://jotai.org/)
- [Recoil](https://recoiljs.org/)
## Metadata
### 버전
- **현재 버전**: 1.0.0
- **최종 업데이트**: 2025-01-01
- **호환 플랫폼**: Claude, ChatGPT, Gemini
### 관련 스킬
- [ui-component-patterns](../ui-component-patterns/SKILL.md): 컴포넌트와 상태 통합
- [backend-testing](../../backend/backend-testing/SKILL.md): 상태 로직 테스트
### 태그
`#state-management` `#React` `#Redux` `#Zustand` `#Context` `#global-state` `#frontend`
## Examples
### Example 1: Basic usage
### Example 2: Advanced usage