사진 출처: 버미노트
- Model
데이터를 관리하는 요소- View
사용자에게 보여지는 부분- Controller
모델의 데이터를 조회 / 업데이트- Action
사용자 / 시스템에서 발생하는 특정 이벤트
Model에서 특정 데이터 변경 시 View에 반영
Action: 사용자 / 시스템에서 발생하는 특정 이벤트.
React에서의 문제점
양방향
Model -> View로 데이터가 흐르지만, 특정 데이터 입력한다던지, View -> Model로 양방향으로 데이터가 흐를 수 있다.
데이터 흐름 복잡성
뷰의 종류가 많아지고 흐름이 복잡해질 경우, 데이터 흐름의 관리가 어려워짐.
사진 출처: 버미노트
흐름 순서
1. Action 발생
2. Dispatcher (Action - Store Data mapping)
3. Store Data 변경
4. View에 반영
Flux는 Redux 상태관리 라이브러리 및 MobX에서 사용하는 패턴인데,
차이점이라면 MobX의 경우, Redux처럼 Dispatcher을 명시적으로 직접 사용 X!
mobX
mobX-react.js
라이브러리 필요Action을 정의하는 방법
Store이 state를 변경하는 방법
decorator
다음과 같은 observable variable
이 있다고 하자.
observable({
_count = 5
})
이는 다음과 같이 표기할 수 있는데, java
에서의 annotation
과 같은 표기를 decorator
이라 칭한다.
@observable
_count = 5;
provider
다수의 스토어들을 component에 따라서 다르게 사용할 수 있는데, root가 되는 APP
에 스토어들을 정의해줌.
// index.js
import { Provider } from 'mobx-react';
ReactDOM.render(
<Provider counterStore={CounterStore}>
<App />
</Provider>,
document.getElementById('root')
);
observable
관찰되어지는 데이터
@observable
_count = 5;
action
observable
데이터를 변경하기 위해서는 해당 메서드에 action
함수의 parameter로 만들어줘야 함.
이를 decorator
로 할 시 다음과 같다.
@action
increment() {
this._count ++;
}
액션을 붙이지 않는다면?!
작동은 되지만 만약 3개의 state 값을 변경한다고 치면,
렌더링이 3번 일어나게 된다.
따라서 action을 붙여야 하는데, 이를 mobX 측에서는 트랜잭션이라고 한다.
inject
해당 클래스의 props
에 store
에서 관리하는 데이터를 주입
@inject('스토어변수명')
class 클래스명 extends Component {
...
}
observer
현재 컴포넌트가 데이터를 주시하고 있음을 명시
makeObservable
mobX6에서 데코레이터에서의 변화가 생기면서 생긴 makeObservable
최근 해당 데코레이터 지원을 뺐음. (표준이 아니라는 측면에서)
constructor() {
makeObservable(this);
}
computed
get 메서드에 일반적으로 적용하거나 모델 객체간 전환 시점에 적용
해당 observable state
변화가 없을 시, 내부 로직 생략하는 api