Redux는 리액트 애플리케이션에서 복잡한 상태 관리를 보다 체계적이고 예측 가능하게 해주는 전역 상태 관리 라이브러리입니다. Action
, Reducer
, Store
를 통해 상태를 업데이트하며 상태 변화를 트래킹할 수 있는 구조를 가지고 있습니다. 하지만 Redux를 사용하다 보면 복잡한 설정 과정과 반복되는 코드, 불변성 관리의 어려움 등 여러 단점이 있습니다.
이를 해결하고자 Redux Toolkit이 등장했습니다. Redux Toolkit은 이런 Redux의 단점을 보완해 더 간편하고 효율적인 상태 관리를 제공하는 라이브러리입니다.
// npm
npm install @reduxjs/toolkit react-redux
// yarn
yarn add @reduxjs/toolkit react-redux
Redux Toolkit과 react-redux를 설치합니다.
import { createSlice } from "@reduxjs/toolkit";
const counterSlice = createSlice({
name: "counterSlice",
initialState: { value: 0 },
reducers: {
up: (state, action) => {
state.value = state.value + action.payload;
},
down: (state, action) => {
state.value = state.value - action.payload;
},
},
});
export const { up, down } = counterSlice.actions;
export default counterSlice.reducer;
createSlice
를 사용하면 하나의 상태와 그 상태를 업데이트하는 액션들을 한 번에 정의할 수 있습니다. createSlice
는 상태 관리에 필요한 모든 것을 포함하는 Slice를 생성합니다.
createSlice의 역할:
import { configureStore } from "@reduxjs/toolkit";
import counterSlice from "./counterSlice";
const store = configureStore({
reducer: {
counter: counterSlice,
},
});
export default store;
configureStore
는 Redux의 중앙 저장소를 생성하며, 여러 슬라이스의 리듀서를 통합하여 애플리케이션의 전역 상태를 관리합니다.
configureStore의 역할:
Redux Thunk
가 내장되어 있어 비동기 처리를 쉽게 수행할 수 있습니다.function App() {
return (
<Provider store={store}>
<Counter />
</Provider>
);
}
export default App;
Redux 상태와 액션을 컴포넌트에서 사용하려면 useDispatch
와 useSelector
훅을 사용합니다.
const Counter = () => {
const dispatch = useDispatch();
const count = useSelector((state) => {
return state.counter.value;
});
const handleCounterDown = () => {
dispatch(down(1));
};
const handleCounterUp = () => {
dispatch(up(1));
};
return (
<div>
<button onClick={handleCounterDown}>-</button>
{count}
<button onClick={handleCounterUp}>+</button>
</div>
);
};
Counter 컴포넌트에서는 상태 값을 선택하고 액션을 디스패치하여 상태를 변경할 수 있습니다.
이 구조를 통해 Redux Toolkit을 간단히 적용할 수 있으며, 불필요한 코드 반복을 줄이고 Redux의 복잡성을 완화할 수 있습니다.
✅ 참고