리덕스 공식 홈페이지에서는 리덕스를 "3개의 근본적이고 중요한 원칙" 으로 설명하고 있습니다.
- Single source of truth : The global state of your application is stored in an object tree within a single sotre.
- State is read-only : The only way to change the state is to emit an action, an object describing what happened.
- Changes are made with pure functions : To specify how the state tree is transformed by actions, you write pure reducers.
위에서 인용한 3가지가 바로 리덕스의 3원칙(?!) 이라고 할 수 있는데요. 1. Single source of truth, 2. State is read-only, 3. Changes are made with pure functions 로 나누어지는 이 3가지에 대해 공식문서를 참고해 정리해보려고 합니다.
직역하면 "단 하나의 진리의 원천" 이라고 하는 어딘가 난해해보이는 표현입니다. 사실 한국어로는 "단일 진실 공급원" 이라는 말로 쓰이고, 구글링해보면 이 문구 자체가 정보시스템 설계 및 이론에서 사용되는 하나의 관용구 라는 것을 알 수 있습니다.
이는 앱에서 사용하는 모든 전역 state 가 단일한 store 에 보관되어야 한다는 원칙을 말합니다. 가변적 데이터인 state 의 출처가 하나라면 당연히 유지보수가 쉬워지겠죠. 공식문서에서도 디버깅은 물론 앱을 검사하는 것이 쉬워 생산성이 향상되고, 범용적인 앱을 만들기 쉽게 한다고 밝히고 있습니다.
state 를 바꾸는 유일한 방법은 무슨 일이 일어났는지를 설명해주는 객체인 action
을 전달하는 것입니다. state 는 이 방법을 제외하고서는 변경되지 않는, '읽기 전용' 이어야 한다는 것이죠.
이러한 방법은 state 로의 직접적인 접근을 막고 발생하는 모든 변경사항을 중앙집중화함으로써, 일어날 수 있는 변수를 차단할 수 있다는 장점이 있습니다. 또한 action
이 순수 객체이기 때문에 기록을 남기고 연속성을 파악하고 보관했다가 다시 살펴보는 등, 디버깅이나 테스트 목적에 유리하게 활용할 수 있습니다.
state 를 바꾸는 유일한 방법이 action
객체를 전달하는 것이라면, 실제로 바뀐 내용을 받아 반영하는 것은 순수한 reducer
함수 입니다. reducer
는 이전의 state 와 action
을 전달받아 변경된 새로운 state 를 돌려주는 순수 함수죠.
reducer 가 immutable 한 방식으로 작동되어야 한다는 것을 이전의 포스팅을 통해서 살펴봤었는데요. state 의 변경이 reducer 를 통해서만 가능하기 때문에, 앱의 규모가 커지더라도 이를 다시 쪼개어 원하는 대로 구분하는 작업이 쉬워진다고 합니다.
내일은 Section 2 를 점검하는 HA 가 있는 날입니다. 그래서 추가적인 Redux 의 공부는 잠시 멈추고, Section 2 를 통해 배운 것들을 정리해보는 시간을 주말까지 가져볼까 합니다. Section 2 도 무리 없이 넘어갈 수 있었으면 좋겠네요. ㅠㅠ