210223_TIL... Redux
오늘 한 일
- Redux 란?
- Redux 가 필요한 이유
- action, reducer, store 개념과 사용법
Redux(리덕스) 란?
Redux 는 Javascript app 을 예측가능한 state container 이다.
다시말해, Redux 는 애플리케이션에서 정교한 상태 관리를 구현하는 데 도움이되는 라이브러리 중 하나이다.
Redux 가 필요한 이유
React 로 프로젝트를 진행하면 각각의 Component 는 local state 를 가지게 되고, 어플리케이션은 global state 를 가지게 된다.
1) local state 의 전달이 어렵다
React 의 경우 props 를 이용해 전달하기 방식이기 때문에 프로젝트의 규모가 커지고, Component 의 수가 늘어나게 된다면 state 를 관리하기가 어렵다. 재일 밑에 있는 자식 Component 가 어떤 state 를 받는 과정에서, 중간에 props 로 data 를 전달하기 위해 필요없는 data 의 흐름이 생기게 된다. 또한, 해당 Component 에서 버그나 문제가 생길 경우, 중간에 끼인 모든 Component 에 가서 일일이 문제점을 찾아봐야 한다(디버깅과 유지보수가 어렵다).
2) global state 유지가 어렵다
대부분의 어플리케이션에서는 유저의 로그인 기능이 구현되어야 한다. 유저의 인증정보를 모든 Component 에 props 로 계속 전달해야 하는데, 훨씬 복잡한 절차를 거치게 될 것이다. 이렇게 React 만으로 프로젝트를 진행하면 global state 를 모든 Component 에 유지하기 어렵다.
3) 하지만 Redux 는 이런 React 의 상태관리 단점을 보완하는데 최적화 됐다
하나의 store 를 통해 모든 state 를 저장, 유지할 수 있게 되며, 원하는 Component 에서 직접 data 를 조회하고 업데이트를 할 수 있다.
Redux 의 기본 개념과 사용법
1) Action
어플리케이션의 store, 즉 저장소로 data 를 보내는 방법이다. view 에서 정의되어 있는 액션을 호출하면 action creators(액션 생성자)는 어플리케이션의 state(상태)를 변경해 준다.
consta ADD_TODO = 'ADD_TODO' // action 의 type 을 정의
action 의 type 은 문자열 상수로 정의된다. 정의된 action type 은 action creators(액션 생성자)를 통해 사용된다.
function addTodo(text) {
return {
type: ADD_TODO,
text
}
}
2) Reducer
action 을 통해 어떤 행동을 정의했다면, 그 결과 어플리케이션의 상태가 어떻게 바뀌는지는 특정하게 되는 함수이다.
function todoApp(state = initialState, action) {
switch (action.type) {
case SET_VISIBILITY_FILTER:
return Object.assign({}, state, {
visibilityFilter: action.filter
});
default:
return state
}
}
reducer 함수에서는 action 의 type 에 따라 변화된 state 를 반환하게 된다.
3) Store
'무엇이 일어날지' 를 나타내는 action 과 action 에 따라 상태를 수정하는 reducer 를 저장하는 어플리케이션에 있는 단 하나의 객체이다.
import { createStore } from 'redux';
import todoApp from './reducers';
let store = createStore(todoApp);
이처럼 store 을 생성하고 reducer 을 연결하여 어플리케이션에 연결하게 된다.
Reference
- React Redux 공식문서
- 초보자를 위한 React Redux 튜토리얼[2019]
- React와 Redux의 불변성 : 완전한 가이드
- React State를 직접 수정하지 않는 이유
- React에 Redux 적용하기(1)