Redux는 JavaScript 애플리케이션의 상태를 중앙 집중식으로 관리하기 위해 고안된 상태 관리 라이브러리입니다. 주로 React와 함께 사용되지만, 다른 JavaScript 프레임워크나 라이브러리에서도 사용할 수 있습니다. Redux는 애플리케이션의 상태를 예측 가능하게 만들고, 디버깅을 용이하게 하며, 상태 관리를 단순화합니다.
Redux는 세 가지 주요 원칙을 기반으로 합니다:
하나의 단일 진실의 원천 (Single Source of Truth)
상태는 읽기 전용 (State is Read-Only)
순수 함수로만 상태를 변경 (Changes are Made with Pure Functions)
Redux는 세 가지 주요 구성 요소로 이루어져 있습니다:
스토어 (Store)
createStore
함수로 생성됩니다.getState
메서드를 통해 현재 상태를 가져올 수 있습니다.dispatch
메서드를 통해 액션을 보낼 수 있습니다.subscribe
메서드를 통해 상태 변경을 감지할 수 있습니다.2.액션 (Action)
- 상태 변경을 설명하는 객체입니다.
- 액션은 type
필드를 가지고 있으며, 상태 변경을 기술하는 추가적인 데이터를 포함할 수 있습니다.
- 액션 생성자 함수는 액션 객체를 생성하는 함수입니다.
combineReducers
함수를 사용하여 여러 리듀서를 하나로 결합할 수 있습니다.const addItem = (item) => ({
type: 'ADD_ITEM',
payload: item
});
store.dispatch(addItem({ id: 1, name: 'Apple' }));
const initialState = {
items: []
};
const itemReducer = (state = initialState, action) => {
switch (action.type) {
case 'ADD_ITEM':
return {
...state,
items: [...state.items, action.payload]
};
default:
return state;
}
};
store.subscribe(() => {
console.log(store.getState());
});
react-redux
패키지를 제공합니다. 주요 구성 요소는 다음과 같습니다:5-1. provider
- Redux 스토어를 React 컴포넌트 계층에 주입합니다.\
import { Provider } from 'react-redux';
import { createStore } from 'redux';
import rootReducer from './reducers';
const store = createStore(rootReducer);
const App = () => (
<Provider store={store}>
<MyComponent />
</Provider>
);
5-2. Connect
- React 컴포넌트를 Redux 스토어에 연결합니다.
- mapStateToProps
와 mapDispatchToProps
를 사용하여 상태와 액션을 컴포넌트의 props로 매핑합니다.
import { connect } from 'react-redux';
import { addItem } from './actions';
const MyComponent = ({ items, addItem }) => {
return (
<div>
<button onClick={() => addItem({ id: 2, name: 'Banana' })}>
Add Banana
</button>
<ul>
{items.map(item => (
<li key={item.id}>{item.name}</li>
))}
</ul>
</div>
);
};
const mapStateToProps = state => ({
items: state.items
});
const mapDispatchToProps = {
addItem
};
export default connect(mapStateToProps, mapDispatchToProps)(MyComponent);
import { createStore } from 'redux';
import { composeWithDevTools } from 'redux-devtools-extension';
import rootReducer from './reducers';
const store = createStore(rootReducer, composeWithDevTools());
redux-thunk
와 redux-saga
가 있습니다.import { createStore, applyMiddleware } from 'redux';
import thunk from 'redux-thunk';
import rootReducer from './reducers';
const store = createStore(rootReducer, applyMiddleware(thunk));
// Thunk 액션 생성자
const fetchItems = () => {
return async dispatch => {
const response = await fetch('/api/items');
const items = await response.json();
dispatch({ type: 'SET_ITEMS', payload: items });
};
};
store.dispatch(fetchItems());
Redux는 상태 관리의 복잡성을 줄이고 예측 가능성을 높이는 강력한 도구입니다. 액션, 리듀서, 스토어라는 세 가지 기본 개념을 통해 상태 변화를 명확하게 관리할 수 있습니다. React와의 통합, Redux DevTools, 미들웨어 등의 기능을 통해 더욱 강력하고 디버깅이 용이한 애플리케이션을 개발할 수 있습니다.