
useReducer 에 대해서 알아보기전에 리액트의 단방향 데이터흐름 패턴에 대해서 간단하게 살펴보자.
페이스북에서만든 데이터 흐름 패턴으로, 데이터의 단방향 흐름을 파악하여 상태관리를 쉽게 할 수 있도록 이해를 높여준다.
액션을 받아 스토어에 전달하는 중간 관리자역할데이터와 상태를 저장하는 곳액션 → 데이터데이터를 화면에 렌더링Flux 아키텍처를 바탕으로 데이터가 어떻게 한 방향으로 흐르는지 살펴보면 다음과 같다.

사용자 입력
↓
Action : { type, payload } 객체 구성
↓
Dispatcher : Action 전달
↓
Store : 전달된 Action으로 데이터 변경
↓
View : 변경된 데이터로 다시 렌더링
[사용자 입력] → [Action] → [Dispatcher] → [Store] → [View]
디스패처라는 단어를 보니 디스패치 가 생각이 나면서...
데이터 흐름을 조금 더 쉽게 이해하기위해 나는 이렇게 비유해서 이해해보았다.
| 단계 | 비유 |
|---|---|
| 액션 (Action) | 사건 발생( |
| 디스패처 (Dispatcher) | 디스패치 기자가 사건정보를 수집 |
| 스토어 (Store) | 정보를 전달받은 방송국, 기사를 쓰기시작 |
| 컨트롤러 뷰(Controller View) & 뷰 (View) | 인터넷에 기사가 올라가고 확인가능한 상태가 됨 |
위 비유는 단순히 각 단계를 이해하기위한 내용이고, 애플리케이션의 데이터 흐름관점으로 단계를 살펴보면 다음과 같다.
먼저, 애플리케이션이 초기화될 때 첫 번째 준비과정을 거친다.
위와같은 준비과정이 끝나면 애플리케이션은 사용자 입력을 받아들일 준비가 완료된 것이다.
🪄 이제 사용자 입력을 통해 액션(Action)이 발생했을 때의 데이터 흐름을 살펴보자.

사용자 입력 발생!뷰 → 액션 : "준비해! (레뒤)"액션 → 디스패처 : "여기 사건(액션)이 발생했어!"디스패처 → 스토어 : "(전달된 액션 순서대로) 여기 발생한 액션 전달할게~"스토어 : "(필요한 액션만 골라서) 보자보자 상황에 맞게 좀 바꿔볼까"스토어 → 컨트롤러 뷰 : "나 구독하고 있지? 여기 니가 필요할만한 것들을 모아봤어. 선물이야😎"컨트롤러 뷰 → 뷰 : "자, 업데이트된 데이터(상태)가 들어왔어! 상태에 맞게 화면 렌더링 시작하자구"뷰 : "업데이트된 데이터(상태)로 렌더링을 시작하지"리액트는 이러한 Flux 아키텍처의 원리를 활용하여 복잡한 상태관리를 하는 훅인 useReducer 를 제공한다.
다음 글에서는 복잡한 상태를 관리하는 훅인만큼 조금은 복잡한 useReducer 에 대해서 살펴보자!

Flux 아키텍처의 전체 흐름
1. 사용자 요청 → 액션 생선
2. 액션을 디스패처에 전달
3. 디스패처가 액션을 스토어에 전달
4. 스토어가 상태 업데이트 및 콜백 실행
5. 뷰가 상태 변경 감지 및 상태 전달요청
6. 뷰가 전달받은 새로운 상태로 리렌더링
🔗 참고자료
https://facebookarchive.github.io/flux/
https://www.youtube.com/watch?v=i__969noyAM&t=125s