앱의 전역 상태(global state)는 단일 store 내의 트리 구조의 객체로 저장된다.
다시말해 rootState가 하나 있고, rootState의 자식으로 reducer1, reducer2와 같은 식으로 될 것이고, 각 reducer 안에 별도의 객체 구조를 가질 수 있다.
useSelector(state => state.reducer1) 라고 하면 rootState의 자식 중 reducer1이 반환하는 state에 접근할 수 있다.
전역객체는 단일 트리 구조로 이루어져 있어 이전 상태를 조회하기 쉬워 디버깅에도 매우 용이하다.
전역 상태를 변경하는 유일한 방법은 Action을 Reducer로 전달하는 것이다.
그래야만 Lifecycle에 따라 리렌더링이 일어나며, 모든 state들이 log 되어 디버깅에 용이한 트리 구조를 유지할 수 있다.
Action에 따라 State변경이 어떻게 이루어지는 지 명확하게 지정하기 위해 Reducer는 '순수 함수'로 만든다. State 변경은 Reducer에서 오직 Action에 의해서만 이루어진다. 따라서 Reducer는 인자로 기존state와 action만을 가지며, 리턴값이 두 매개변수 외에 다른 외부변수와는 전혀 관계가 없는 '순수 함수'로만 이루어져 있다.
UI에서 버튼 클릭과 같은 이벤트가 일어났을 때 dispatch 메소드로 Action 객체를 Reducer로 전달해 주고, Reducer는 Action 객체의 type에 따라 기존 state를 참조해 새로운 State를 만들어준다.