상태 모델
하위 상태가 서로 연결되어 함께 바뀌는지 먼저 묶어 본다.
`useReducer`를 도입할 때는 상태 모양, 액션 이름, 리듀서 순수성, 사이드 이펙트 위치를 분리해야 예측 가능한 흐름이 된다.
하위 상태가 서로 연결되어 함께 바뀌는지 먼저 묶어 본다.
사용자 의도를 ADD_TODO 같은 명명된 이벤트로 만든다.
reducer는 현재 state와 action만 보고 새 state를 반환한다.
UI 이벤트는 계산을 직접 하지 않고 action을 전달한다.
저장, 요청, 로그 같은 외부 작업은 useEffect로 옮긴다.
토글, 입력값처럼 로직이 짧으면 `useState`가 더 읽기 쉽다.
로딩, 성공, 실패, 재시도처럼 상태 전이가 명확하면 reducer가 좋다.
dispatch 참조는 안정적이어서 Context와 함께 공유하기 좋다.