🚀 React에서 상태를 좀 더 효율적으로 관리하기 위해 상태관리 라이브러리 Redux를 사용한다.
상태관리 라이브러리를 이용하면 해당 데이터를 필요로 하는 컴포넌트에서만 사용 가능하게 만들 수 있다. (Props drilling 이슈 해결)
애플리케이션의 규모가 확장되더라도 유지보수가 용이하다.
Redux는 상태관리 라이브러리 중 하나이다.
2015년 6월 Dan Abramov에 의해 개발되었으며, Flux 아키텍처의 영향을 받아 Reducer + Flux를 합쳐 Redux라는 이름을 가지게 되었다.
Flux 패턴은 Facebook에서 개발되었으며, 단방향 데이터 흐름을 가지고 애플리케이션 상태를 예측 가능하고 유지보수가 가능한 방식으로 관리하는데 용이하다.
사용자 입력으로부터 Action을 만들고 Dispatcher에 전달해 Store에 데이터를 저장 또는 변경하고 최종 View에 반영하는 구조를 가지고 있다.
🌟 Single source of truth
🌟 State is read-only
🌟 Changes are made with pure functions
Action
은 Store
에 저장 또는 변경할 데이터 (ex. 주문서)
{
type: 'ACTION_NAME', // name
payload: { // options
count: 0
}
}
Action
은 type과 데이터(payload)로 이루어진 객체
Reducer
는 Action
을 받아서 Store
에 전달한다. (ex.주문)
function counter(state, action) {
switch (action.type) {
case 'INCREASE' :
return state + 1;
default:
return state;
}
}
Reducer
는 Action
에서 주문을 보고 Store
에 상태를 업데이트한다.
Store
는 모든 상태가 관리되는 유일한 저장소다.
View
는 Store
에 업데이트된 상태를 사용자에게 보여준다.
1) 사용자 View
에서 Action
을 발생시켜 dispatch()
메서드를 호출한다.
2) Dispatch
는 Action
에서 type
과 현재 state
를 받아 Ruducer
를 호출한다.
3) Ruducer
는 Action type
에 따라 상태를 업데이트 후 새로운 state
반환한다.
4) State
가 업데이트 될 때마다 View
에 반영하기 위해 Render
함수를 Subscribe
에 등록한다.
5) State
가 업데이트가 되면 Dispatch
는 Subscribe
를 이용해서 등록된 Render
함수를 호출한다.
6) Render
는 Store
에 있는 getState
로 부터 새롭게 반환된 state
를 가져온다.
7) Render
는 변경된 state
를 가지고 View
에 최종 반영한다.
👍 순수함수를 사용해 상태를 예측 가능하게 만든다.
Reducer
함수는 이전 상태와 액션을 기반으로 상태를 변경이 아닌 순수함수를 통해 새로운 상태 객체를 생성해서 반환한다.👍 유지보수가 용이하다.
Store
에서 모든 상태를 관리한다.👍 상태 값을 추적하기 쉽다.
Redux Dev Tool
을 이용한 Debugging에 유리하다.👍 비동기를 지원하는 Middleware가 존재한다.
redux-thunk
, redux-saga
👎 Redux는 Action
을 미리 만들어 놓아야하는 불편함이 존재한다.
Action
을 모두 만들어야해서 코드량이 증가한다.👎 러닝 커브가 높다.
👎 불변성을 유지해야 한다.
state
객체를 생성한다.