React/Hooks/Lesson 10
useReducer — useState 로 한계가 올 때, Redux 의 기반
35분·theory
이 챕터
2/5
TypeScript
useReducer — useState 로 한계가 올 때, Redux 의 기반
💡 왜 배워야 할까요? — useState 가 더러워지는 순간이 있다
🎯
useState 5~6개가 한 컴포넌트에 쌓이고, 그것들이 서로 영향을 주는 순간 — 상태 업데이트 코드가 손 댈수록 깨지기 쉬워집니다.
💼
useReducer 는 그런 상태들을 **하나의 객체 + dispatch(action) 패턴**으로 정리합니다. 어떤 액션이 어떤 변경을 만드는지 reducer 함수에 모두 적혀 있어 추적 가능.
⚡
Redux Toolkit·Zustand·useActionState(React 19) — 모두 useReducer 와 같은 사고방식. 이걸 알아야 그쪽으로 자연스럽게 넘어갑니다.
🔗
면접 단골 질문: 'useState 와 useReducer 의 선택 기준?' — 상태 개수·복잡도·여러 곳에서의 업데이트 여부.
🏢 실무에서는
쇼핑 카트(상품 추가·수량 변경·삭제·전체 비우기), 폼 위저드(다음·이전·저장·검증), 협업 캔버스(도형 추가·이동·복사·undo) — 모두 useReducer 의 영역. 액션 종류가 늘어도 reducer 한 곳에 분기를 추가하면 끝.
reducer · action · dispatch — 3가지 개념
1. 시그니처
- ▸
reducer: (state, action) => newState 인 순수 함수 - ▸
dispatch(action): reducer 를 호출해서 state 를 업데이트
2. Discriminated Union 으로 action 타입 정의
type 필드(태그)로 분기되는 union. switch 안에서 각 case 마다 action 의 추가 필드가 정확히 추론됩니다.
3. reducer — 순수 함수, 절대 mutate 금지
4. useState vs useReducer 선택 기준
💡 💡 useReducer 실전 5
1. reducer 는 반드시 순수 함수
같은 (state, action) 이면 항상 같은 결과. fetch·setTimeout 같은 side effect 금지.
2. state mutate 절대 금지
3. Discriminated Union 으로 action 타입
switch 안에서 case 별로 action 의 다른 필드들이 정확히 추론됨.
4. never 로 exhaustive check
Action 에 새 type 추가했는데 case 안 적었으면 컴파일 에러로 알려줌.
5. Context + useReducer = 미니 Redux
작은 앱에선 Redux 안 써도 충분.
⚡ 직접 실행해보기 — reducer 패턴
쇼핑카트 reducer 의 액션 처리를 시뮬레이션합니다.
✏️ JS 코드
📟 콘솔 출력
▶ 실행 버튼을 눌러보세요
⚠️ 브라우저 샌드박스에서 실행 — console.log()만 지원, alert/fetch 불가
확인 퀴즈
useReducer 가 useState 보다 적합한 상황은?
먼저 읽으면 좋은 개념: useEffect
다음 추천: SyntheticEvent — 이벤트 타입