็„ก์ œ

Redux (๋ฆฌ๋•์Šค) ๋ณธ๋ฌธ

<React>

Redux (๋ฆฌ๋•์Šค)

yo-u-loo 2026. 7. 16. 17:50

 

๐ŸŸก Redux

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ „์—ญ ์ƒํƒœ(Global State)๋ฅผ ํ•œ ๊ณณ์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ.

๊ณต์œ ํ•ด์•ผ ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์˜ Store์—์„œ ๊ด€๋ฆฌํ•˜์—ฌ ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋™์ผํ•œ ์ƒํƒœ๋ฅผ ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค.

 

โ—ผ๏ธ ํ•„์š” ์ด์œ 

React์—์„œ๋Š” useState๋กœ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์˜ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ , ๋ถ€๋ชจ์—์„œ ์ž์‹์œผ๋กœ props๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ์—์„œ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„์ง„๋‹ค. ์ด๋•Œ ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ๊ฐ€ ๊นŠ์–ด์ง€๋ฉด ์ค‘๊ฐ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ๊นŒ์ง€ ๊ณ„์† ์ „๋‹ฌํ•ด์•ผ ํ•˜๋Š” Props Drilling ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ , ์„œ๋กœ ๊ด€๊ณ„์—†๋Š” ์ปดํฌ๋„ŒํŠธ๋ผ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•˜๋Š” ๊ฒƒ๋„ ์–ด๋ ค์›Œ์ง„๋‹ค.

Redux๋Š” ์ด๋Ÿฌํ•œ ์ƒํƒœ๋ฅผ ํ•˜๋‚˜์˜ Store์—์„œ ์ „์—ญ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ง์ ‘ ์ƒํƒœ๋ฅผ ์กฐํšŒํ•˜๊ณ  ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์–ด ๋ฐ์ดํ„ฐ๋ฅผ ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ๊ด€๋ฆฌํ•˜๊ณ  Props Drilling ๋ฌธ์ œ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ‘‰ Redux๋Š” React๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ JavaScript ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฐ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, React์—์„œ๋Š” ์ฃผ๋กœ react-redux์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•œ๋‹ค.

 

โ—ผ๏ธ ํ•ต์‹ฌ ๊ฐœ๋…

1๏ธโƒฃ ํ•˜๋‚˜์˜ Store์—์„œ ์ƒํƒœ ๊ด€๋ฆฌ

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ „์—ญ ์ƒํƒœ๋Š” ํ•˜๋‚˜์˜ Store์—์„œ ๊ด€๋ฆฌํ•œ๋‹ค.

Store
 โ”œโ”€ user
 โ”œโ”€ cart
 โ”œโ”€ products
 โ””โ”€ theme

 

2๏ธโƒฃ State๋Š” ์ง์ ‘ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š”๋‹ค.

State๋Š” ์ง์ ‘ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  Action์„ ํ†ตํ•ด ๋ณ€๊ฒฝ์„ ์š”์ฒญํ•œ๋‹ค.

dispatch({
  type: "counter/up"
});

 

3๏ธโƒฃ Reducer๊ฐ€ ์ƒˆ๋กœ์šด State๋ฅผ ๋งŒ๋“ ๋‹ค.

Reducer๋Š” ํ˜„์žฌ State์™€ Action์„ ๋ฐ›์•„ ์ƒˆ๋กœ์šด State๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ˆœ์ˆ˜ ํ•จ์ˆ˜(Pure Function)์ด๋‹ค.

(state, action) => newState
  • ๋™์ผํ•œ ์ž…๋ ฅ์ด๋ฉด ํ•ญ์ƒ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.

 

โ—ผ๏ธ ๋ฐ์ดํ„ฐ ํ๋ฆ„

Redux๋Š” ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

 ์‚ฌ์šฉ์ž ์ด๋ฒคํŠธ ๋ฐœ์ƒ
        ↓
   Action ์ƒ์„ฑ
        ↓
  dispatch() ํ˜ธ์ถœ
        ↓
   Reducer ์‹คํ–‰
        ↓
 ์ƒˆ๋กœ์šด State ์ƒ์„ฑ
        ↓
  Store ์—…๋ฐ์ดํŠธ
        ↓
 ์ปดํฌ๋„ŒํŠธ ๋ฆฌ๋ Œ๋”๋ง
  • ์ด ๊ตฌ์กฐ ๋•๋ถ„์— ์ƒํƒœ ๋ณ€ํ™” ๊ณผ์ •์„ ์ถ”์ ํ•˜๊ธฐ ์‰ฝ๊ณ  ๋””๋ฒ„๊น…๋„ ์ˆ˜์›”ํ•˜๋‹ค.

 

โ—ผ๏ธ ์ฃผ์š” ์ปดํฌ๋„ŒํŠธ

๐Ÿ”น store

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ชจ๋“  ์ „์—ญ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ณต๊ฐ„์ด๋‹ค.

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

 

๐Ÿ”น state

ํ˜„์žฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ์ด๋‹ค.

  • ๋กœ๊ทธ์ธ ์ •๋ณด
  • ์žฅ๋ฐ”๊ตฌ๋‹ˆ
  • ๊ฒŒ์‹œ๊ธ€ ๋ชฉ๋ก
  • ๋‹คํฌ๋ชจ๋“œ ์—ฌ๋ถ€

 

๐Ÿ”น action

์–ด๋–ค ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ• ์ง€ ์„ค๋ช…ํ•˜๋Š” ๊ฐ์ฒด์ด๋‹ค.

{
  type: "counter/up"
}
  • ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•จ๊ป˜ ์ „๋‹ฌํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
{
  type: "counter/up",
  payload: 5
}
  • type : ์–ด๋–ค ์ž‘์—…์ธ์ง€ ๊ตฌ๋ถ„
  • payload : ํ•จ๊ป˜ ์ „๋‹ฌํ•  ๋ฐ์ดํ„ฐ

 

๐Ÿ”น dispatch

Action์„ Store๋กœ ์ „๋‹ฌํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.

dispatch({
  type: "counter/up"
});
  • Dispatch๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด Reducer๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

 

๐Ÿ”น reducer

Action์— ๋”ฐ๋ผ ์ƒˆ๋กœ์šด State๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.

function reducer(state, action) {
  switch (action.type) {
    case "counter/up":
      return {
        value: state.value + 1
      };

    default:
      return state;
  }
}
  • Reducer์—์„œ๋Š” ๊ธฐ์กด State๋ฅผ ์ง์ ‘ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ์ƒˆ๋กœ์šด State๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.

 

โ—ผ๏ธ React์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ์ฃผ์š” API

๐Ÿ”น Provider

Redux Store๋ฅผ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์—ฐ๊ฒฐํ•œ๋‹ค.

<Provider store={store}>
  <App />
</Provider>
  • ๋ชจ๋“  ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ Store๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ”น useSelector()

Store์—์„œ ํ•„์š”ํ•œ State๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

const count = useSelector(state => state.counter.value);
  • ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ State๋ฅผ ์กฐํšŒํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

 

๐Ÿ”น useDispatch()

Action์„ Store๋กœ ์ „๋‹ฌํ•œ๋‹ค.

const dispatch = useDispatch();

dispatch(counterSlice.actions.up());
  • ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

 

โ—ผ๏ธ ํ™œ์šฉ ์‚ฌ๋ก€

  • ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•  ๋•Œ
  • ์ „์—ญ ์ƒํƒœ๊ฐ€ ๋งŽ์„ ๋•Œ
  • ์ƒํƒœ ๋ณ€๊ฒฝ ๋กœ์ง์ด ๋ณต์žกํ•  ๋•Œ
  • ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ํฐ ๊ฒฝ์šฐ
  • ํ˜‘์—… ์‹œ ์ผ๊ด€๋œ ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•  ๋•Œ

 

 

๐Ÿ“ POINT ๐Ÿ“

โœ”๏ธ ํ˜„์žฌ Redux์—์„œ๋Š” Redux Toolkit(RTK) ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•œ๋‹ค. โœ”๏ธ

 


 

๐Ÿ”— react-redux ์„ค์น˜ ๐Ÿ”—

https://react-redux.js.org/

terminal

# If you use npm:
npm install redux
npm install react-redux

# Or if you use Yarn:
yarn add react-redux
  • ๋ฆฌ๋•์Šค / ๋ฆฌ์•กํŠธ๋ฆฌ๋•์Šค ๋‘˜ ๋‹ค ์„ค์น˜.