
"여러 컴포넌트에서 공유하는 데이터를 관리하는 것"
Header 컴포넌트 ─┐
├─→ 사용자 정보 (로그인 상태)
Cart 컴포넌트 ───┤
│
Profile 컴포넌트─┘
"가장 유명한 상태관리 라이브러리 (2015년)"
// 1. Action 정의
const LOGIN = 'LOGIN';
const LOGOUT = 'LOGOUT';
// 2. Action Creator
const login = (user) => ({ type: LOGIN, payload: user });
const logout = () => ({ type: LOGOUT });
// 3. Reducer
const userReducer = (state = null, action) => {
switch (action.type) {
case LOGIN:
return action.payload;
case LOGOUT:
return null;
default:
return state;
}
};
// 4. Store 생성
const store = createStore(userReducer);
// 5. 사용
store.dispatch(login({ name: '아엔' }));
"간단하고 가벼운 상태관리 라이브러리 (2019년)"
// 1. Store 생성 (끝!)
import { create } from 'zustand';
const useUserStore = create((set) => ({
user: null,
login: (user) => set({ user }),
logout: () => set({ user: null }),
}));
// 2. 사용
function Header() {
const { user, login, logout } = useUserStore();
return (
<div>
{user ? (
<button onClick={logout}>로그아웃</button>
) : (
<button onClick={() => login({ name: '아엔' })}>로그인</button>
)}
</div>
);
}
Redux:
// actions.ts
export const LOGIN = 'LOGIN';
export const LOGOUT = 'LOGOUT';
export const login = (user) => ({
type: LOGIN,
payload: user,
});
export const logout = () => ({
type: LOGOUT,
});
// reducer.ts
const initialState = {
user: null,
};
export const userReducer = (state = initialState, action) => {
switch (action.type) {
case LOGIN:
return { ...state, user: action.payload };
case LOGOUT:
return { ...state, user: null };
default:
return state;
}
};
// store.ts
import { createStore } from 'redux';
import { userReducer } from './reducer';
export const store = createStore(userReducer);
// 컴포넌트에서 사용
import { useDispatch, useSelector } from 'react-redux';
function Header() {
const user = useSelector((state) => state.user);
const dispatch = useDispatch();
return (
<button onClick={() => dispatch(login({ name: '아엔' }))}>
로그인
</button>
);
}
Zustand:
// store.ts
import { create } from 'zustand';
export const useUserStore = create((set) => ({
user: null,
login: (user) => set({ user }),
logout: () => set({ user: null }),
}));
// 컴포넌트에서 사용
import { useUserStore } from './store';
function Header() {
const { user, login } = useUserStore();
return (
<button onClick={() => login({ name: '아엔' })}>
로그인
</button>
);
}
코드 양 차이: Redux 약 50줄 vs Zustand 약 15줄
장점:
단점:
장점:
단점:
대기업/대규모 프로젝트:
네이버, 카카오, 토스 등
- 팀 규모: 10명 이상
- 프로젝트 규모: 대형
- 복잡한 비즈니스 로직
- 엄격한 상태 관리 필요
예시:
스타트업/중소규모 프로젝트:
빠른 개발 속도 필요
- 팀 규모: 1~5명
- 프로젝트 규모: 중소형
- 간단한 상태 관리
- 빠른 프로토타이핑
예시:
✅ 대규모 프로젝트
✅ 복잡한 상태 관리 필요
✅ 팀이 Redux 경험 많음
✅ 강력한 디버깅 도구 필요
✅ 시간여행 디버깅 필요
✅ 새 프로젝트 시작
✅ 간단한 상태 관리
✅ 빠른 개발 속도 필요
✅ 작은 팀
✅ 번들 크기 중요
"상태관리 = Redux"
모든 프로젝트에 Redux 사용
"프로젝트 규모에 맞게 선택"
- 대규모: Redux
- 중소규모: Zustand, Recoil
- 간단함: Context API
Zustand 같은 경량 라이브러리 증가
Redux는 대기업/레거시 유지
Zustand 추천!
- 코드 간결 → 면접관이 보기 좋음
- 빠르게 개발 가능
- 최신 트렌드
Redux 공부는 필수!
- 면접에서 자주 물어봄
- 실무에서 만날 가능성 높음
- 하지만 새 프로젝트는 Zustand로
학습 시간: 2~3주
난이도: ★★★★☆
1주차: Action, Reducer 개념
2주차: Middleware, DevTools
3주차: TypeScript 적용
학습 시간: 1~2일
난이도: ★★☆☆☆
1일차: 기본 사용법
2일차: TypeScript, 미들웨어
1. Zustand로 시작 (빠르게 익힘)
2. Redux 개념 공부 (면접 대비)
3. 프로젝트는 Zustand로 진행
4. Redux는 필요할 때 사용
"실무에서는 상황에 맞게 선택하는 게 중요함!"