Redux란??
상태의 중앙 관리를 위한 상태 관리 도구이다. React외에도 Angular, Vue, JQuery 등에서도 사용 가능한 라이브러리다.
React프로젝트를 진행하다보면, 컴포넌트들을 쪼개서 관리하게 된다.
그리고 각각의 컴포넌트들은 state를 가지고있다.
app.js ---sweet---> apple.js
단순한 구조에서 apple.js는 sweet라는 props를 간단하게 전달받을 수 있다.
app.js ---sweet---> fruites.js ---sweet---> apple.js
중간에 컴포넌트가 하나 더 생기게 되면, app.js에서 props를 물려주고, friutes에서 한번 더 물려주게 된다. 만약에 컴포넌트가 100개라면 중간에서 사용하지도 않는 props를 하위 컴포넌트에서 사용하기 위해 100번 물려주어야 하는 것이다.
이와같은 단점을 보완하기 위해, Flux에서 영감을 받아 Redux가 개발되었다.
설치
npm i redux react-redux
개념과 사용법
원하는 부분에서 action을 보내면, reducer가 data state값을 리턴한다.
//store 정의
import React from 'react';
import ReactDOM from 'react-dom';
import {createStore} from 'redux';
import { Provider } from 'react-redux';
import App from './App';
import reducer from '../reducers';
const store = createStore(reducer);
ReactDOM.render(
<Provider store={store}>
<App />
</Provider>,
document.getElementById('root')
);
//reducer 사용
const reducer = (state = initialState, action) => {
switch(action.type){
case LOGIN:
return {
...state,
loginState: true,
}
case LOGOUT:
return {
...state,
loginState: false,
};
default:
return state;
}
}
불변성 : React에서 편하게 상태를 관리하기 위해 객체 타입을 사용하는데, 이는 참조 타입이라 불변성을 유지할 수 없다. 그래서 기존의 주소 값과 다른 새로운 객체를 생성하여 복사한 뒤 해당 프로퍼티를 바꾸는 작업이 필요하다.
export const LOGIN = 'LOGIN';
export const LOGOUT = 'LOGOUT';
store.subscribe(render);
const unsubscribe = store.subscribe(() => console.log(`상태 변경 감지: ${store.getState()}`));
unsubscribe(); // 구독 취소
ContextAPI와 다른점?
ContextAPI는 Redux와 마찬가지로 상태의 중앙 관리를 위한 상태 관리 도구이다. Context API는 크게 전역 상태가 저장되는 context, 전역 상태를 제공하는 Provider, 그리고 전역 상태를 받아 사용하는 Consumer로 나뉘어져 있다.
ContextAPI는 Redux와 달리 React에서만 사용가능하고, 저장소가 여러개 존재할 수 있다.
Redux는 전역 관리 상태 외에 다양한 기능을 제공하는점이 ContextAPI와 차이점이다. 또한, Context API는 high-frequency updates에 좋지 않은 성능을 보이지만 Redux는 그렇지 않다.
Redux 기능
참고 : cada estaid.dev 야무 zerocho