웹 풀스택

[React] Redux 사용하기

kevinmj12 2025. 4. 14. 21:35

Redux

https://www.npmjs.com/package/redux

 

redux

Predictable state container for JavaScript apps. Latest version: 5.0.1, last published: a year ago. Start using redux in your project by running `npm i redux`. There are 18534 other projects in the npm registry using redux.

www.npmjs.com

 

Redux란 자바스크립트에서 상태를 관리하기 위한 라이브러리이다.

React에서 컴포넌트트 자체적으로 상태를 가지고 있고, props를 통해서 컴포넌트의 상태를 전달할 수 있지만,

앱이 커지면서 여러 컴포넌트가 분산되면 이를 관리하기가 어려워진다.

 

이 때 Redux를 사용하면 상태들을 한 곳에 모아 중앙 집중식으로 관리할 수 있게 된다.

 

기본적인 사용법

// counterSlice.js

import { createSlice } from '@reduxjs/toolkit';

const counterSlice = createSlice({
  name: 'counter', // slice의 이름 (action type 접두어로도 쓰임)
  initialState: { value: 0 }, // 초기 상태
  reducers: {
    increment: (state) => {
      state.value += 1; // immer 라이브러리를 써서 불변성 걱정 없이 직접 수정 가능
    },
    decrement: (state) => {
      state.value -= 1;
    },
  }
});

export const { increment, decrement } = counterSlice.actions;
export default counterSlice.reducer;

createSlice()는 상태 관리에 필요한 액션(Action)과 리듀서(Reducer)를 한 번에 만들어주는 함수이다.

위 코드에서는 couterSlice를 통해 reducer에 increment, decrement가 정의되었다.

 

// store.js

import { configureStore } from '@reduxjs/toolkit';
import counterReducer from './counterSlice';

export const store = configureStore({
  reducer: {
    counter: counterReducer
  }
});

위와 같이 만들어진 reducer들은 모두 하나의 파일에서 관리된다.

위 코드에서는 store.js에서 관리를 하고 있으며, configureStore()내에 관리할 reducer들을 넣어주면 된다.

 

// Main.js

<Provider store={store}>
  <App />
</Provider>

store를 사용하기 위해서는 실행되는 App을 <Provider store={store}>으로 감싸주어야 한다.

 

// App.jsx

const dispatch = useDispatch();
const count = useSelector(state => state.counter.value);

<button onClick={() => dispatch(increment())}>+1</button>

이제 어디서든 counterReducer를 통해 increment, decrement를 사용할 수 있게 되었다.

Dispatch를 통해 Action을 Store에 보낼 수 있고, Selector를 통해 Store에서 상태를 가져올 수 있다.

위에서는 disapatch(increment())를 통해 카운터를 증가시키는 increment() Action을 보내고 있고,

count 값을 통해 Store에서 상태를 가져오게 된다.