모듈식 상태 기계와 Redux를 통한 중앙 집중형 조정
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
웹 개발
대상자
프론트엔드 개발자, Redux 및 상태 관리 패턴을 사용하는 개발자.
- 중급~고급 수준의 내용으로, 복잡한 UI 상태 관리와 모듈화된 아키텍처 설계에 관심 있는 개발자에게 유용.
핵심 요약
- Redux는 상태 기계와의 협업을 위한 중앙 조정 레이어로만 사용 (예:
useMachine()
훅으로 내부 상태 관리). - 모듈식 컴포넌트는 독립적인 상태 기계를 통해 전역 상태와의 결합을 최소화 (예:
PoolSelector
컴포넌트의 자기주도 상태 관리). - Redux에 저장된 상태는 컴포넌트 초기화(
hydrate
)에만 사용, 이후 상태 전환은 상태 기계 내부에서 처리. - 중복된 상태 관리가 의도적 (예: Redux에 간단한 스냅샷, 상태 기계에 풍부한 컨텍스트 저장).
섹션별 세부 요약
1. **Hydration (초기화)**
- 컴포넌트가 마운트 시 Redux에서 저장된 상태(
saved filters
,route state
)로 내부 상태 기계 초기화. useSelector
와useEffect
를 활용해HYDRATE
이벤트 발생.
```jsx
const filters = useSelector(selectSavedFilters)
useEffect(() => {
send({ type: 'HYDRATE', filters })
}, [])
```
2. **Ownership (상태 소유권)**
- 상태 기계가 상태 전환, 유효성 검증, 사용자 상호작용을 독립적으로 처리.
- Redux와의 결합은 최소한의 메타데이터 (예:
selected pool ID
,filter summary
)로 제한.
3. **Broadcasting (상태 전파)**
- 의미 있는 상태 변화 (예:
submitted
상태) 발생 시 Redux로 상태 업데이트 전달.
```jsx
if (state.matches('submitted')) {
dispatch(setFilters({ filters: ctx.filters }))
}
```
- 선택적 전파 (예: 상태 경계에만, 키보드 입력마다 아님).
4. **Intentional Duplication (의도적 중복)**
- Redux: 간단한 스냅샷 (예:
selected pool ID
). - 상태 기계: 풍부한 컨텍스트 (예:
step logic
,validation flags
). - 중복은 클리어리티와 결합 해제를 위한 전략.
5. **Avoiding Cycles (순환 흐름 방지)**
- Redux → 상태 기계 → Redux 순환 흐름은 피해야 함.
- Redux 액션을 명령으로 사용, 내부 컴포넌트가 이벤트를 수신해 반응.
```jsx
const shouldReset = useSelector(selectShouldReset)
useEffect(() => {
if (shouldReset) send('RESET')
}, [shouldReset])
```
결론
- Redux는 중앙 조정 레이어로만 사용 (예:
setFilters
액션으로 상태 업데이트). - 모듈식 컴포넌트는 상태 기계로 독립적으로 설계 (예:
PoolSelector
컴포넌트). - 의도적 중복과 Redux 상태의 최소화가 시스템의 확장성과 유지보수성을 향상.
- Redux 페이지 슬라이스 사용 (예: 뷰별 슬라이스)으로 전역 네임스페이스 충돌 방지.