-
Notifications
You must be signed in to change notification settings - Fork 6
MobX 상태관리와 useState 상태관리
YoungWoo Yoon edited this page Dec 15, 2020
·
1 revision
AccountBook List Page를 처음에 MobX를 이용하여 상태관리를 하였다. 후에 전역적으로 관리할 페이지가 1개 뿐이고, 컴포넌트의 개수와 깊이가 깊지 않아서 useState로 리팩토링하였다. 그러면서 느꼈던 차이점을 간단하게 정리하였다.
-
mobx를 사용하면서 먼저 주의해야 할 점은 useContext로 옵저버블 데이터를 받을 때 구조 분해 할당을 해서는 안된다는 것이다.
구조분해할당을 하면 옵저버블에서 일반 객체로 변환되어 데이터 변화에 따른 렌더링이 일어나지 않게 되기 때문이다.
-
MobX의 구조는 보통 Store, Context, Hook 으로 나뉘게 된다. MobX는 불변성을 지키지 않아도 되어서 사용하기 매우 편리하다고 느꼈다.
-
useState의 객체를 수정할 때는 직접 수정하면 안된다. 대신 spread 문법을 사용하여 기존 객체를 복사하여 새로운 객체를 만들고, 이 새로운 객체에서 상태를 업데이트 해줘야 한다. 즉, 불변성을 지켜줘야만 리액트가 컴포넌트의 상태가 업데이트 됐음을 감지할 수 있고 필요한 부분만을 리렌더링 할 수 있다.
function RandomList() { const [items, setItems] = useState([]); const addItem = () => { setItems([ ...items, { id: items.length, value: Math.random() * 100 } ]); }; return ( <> <button onClick={addItem}>Add a number</button> <ul> {items.map(item => ( <li key={item.id}>{item.value}</li> ))} </ul> </> ); }
이건 Redux도 똑같은 부분이었는데 MobX에 비하면 사용하기에 있어 불편함이 따르는 부분이다. 물론 immutable한 값을 사용하는 것은 장점이 있다.
- 수정이 불가능하면 side effect가 발생할 확률이 낮아진다. side effect가 없는 함수는 병렬 처리를 효율적으로 할 수 있다.
- 수정 불가능한 변수는 thread-safe하므로 동기화 문제에서 자유롭다. 두 개의 스레드가 동시에 같은 변수를 수정하려고 하는 경우를 생각해보면 이해하기 쉽다.