็„ก์ œ

reducer์™€ reducers ๋ณธ๋ฌธ

<React>

reducer์™€ reducers

yo-u-loo 2026. 7. 20. 12:34

 

๐ŸŸก reducer์™€ reducers

Redux Toolkit์„ ์‚ฌ์šฉํ•  ๋•Œ reducer(๋‹จ์ˆ˜)์™€ reducers(๋ณต์ˆ˜)๋Š” ์ด๋ฆ„์€ ๋น„์Šทํ•˜์ง€๋งŒ ์˜๋ฏธ๊ฐ€ ๋‹ค๋ฅด๋‹ค.

 

โ—ผ๏ธ reducer (๋‹จ์ˆ˜)

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

Redux์—์„œ ์ƒํƒœ ๋ณ€๊ฒฝ์„ ๋‹ด๋‹นํ•˜๋Š” ํ•ต์‹ฌ ํ•จ์ˆ˜์ด๋ฉฐ, createSlice()๋กœ ์ƒ์„ฑ๋œ ์ตœ์ข… Reducer๋„ reducer์ด๋‹ค.

(state, action) => newState
  • Slice๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ์ตœ์ข…์ ์œผ๋กœ ํ•˜๋‚˜์˜ reducer๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค.
export default counterSlice.reducer;

 

โ—ผ๏ธ reducers (๋ณต์ˆ˜)

reducers๋Š” createSlice() ๋‚ด๋ถ€์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ reducer ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฐ์ฒด์ด๋‹ค.

๊ฐ ํ•จ์ˆ˜๋Š” ํ•˜๋‚˜์˜ Action๊ณผ ์—ฐ๊ฒฐ๋˜๋ฉฐ, Redux Toolkit์ด Action๊ณผ Reducer๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ด ์ค€๋‹ค.

const counterSlice = createSlice({
  name: "counter",
  initialState: {
    value: 0,
  },
  reducers: {
    increment(state) {
      state.value++;
    },

    decrement(state) {
      state.value--;
    },
  },
});
  • increment(): ํ•˜๋‚˜์˜ reducer ํ•จ์ˆ˜.
  • decrement(): ํ•˜๋‚˜์˜ reducer ํ•จ์ˆ˜.
  • reducers: reducer ํ•จ์ˆ˜๋“ค์„ ๋ชจ์•„๋‘๋Š” ๊ฐ์ฒด.

 

โ—ผ๏ธ ๊ด€๊ณ„

reducers์— ์ •์˜๋œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ reducer ํ•จ์ˆ˜๋ฅผ Redux Toolkit์ด ํ•˜๋‚˜๋กœ ํ•ฉ์ณ ์ตœ์ข… reducer๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

const counterSlice = createSlice({
  reducers: {
    increment() {},
    decrement() {},
    reset() {},
  },
});

export default counterSlice.reducer;
  • reducers: ์—ฌ๋Ÿฌ ๊ฐœ์˜ reducer๋ฅผ ์ •์˜ํ•˜๋Š” ๊ณณ.
  • reducer: reducers๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒ์„ฑ๋œ ์ตœ์ข… Reducer.

 

 

๐Ÿ“ POINT ๐Ÿ“

โœ”๏ธ reducer๋Š” ํ•˜๋‚˜์˜ ์ƒํƒœ ๋ณ€๊ฒฝ ํ•จ์ˆ˜์ด๋‹ค. โœ”๏ธ

โœ”๏ธ reducers๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ reducer ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฐ์ฒด์ด๋‹ค. โœ”๏ธ

โœ”๏ธ createSlice()๋Š” reducers๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋‚˜์˜ reducer๋ฅผ ์ž๋™ ์ƒ์„ฑํ•œ๋‹ค. โœ”๏ธ

 

 

๐Ÿ“‹ reducer vs reducers  ๐Ÿ“‹

๊ตฌ๋ถ„ reducer reducers
์˜๋ฏธ State๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ํ•˜๋‚˜์˜ ํ•จ์ˆ˜ ์—ฌ๋Ÿฌ reducer ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฐ์ฒด
์‚ฌ์šฉ ์œ„์น˜ counterSlice.reducer createSlice() ๋‚ด๋ถ€
๊ฐœ์ˆ˜ 1๊ฐœ ์—ฌ๋Ÿฌ ๊ฐœ
์—ญํ•  State ๋ณ€๊ฒฝ State ๋ณ€๊ฒฝ ํ•จ์ˆ˜๋“ค์„ ์ •์˜

 


 

โš™๏ธ Redux Toolkit์˜ createSlice ์‚ฌ์šฉ โš™๏ธ

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

const counterSlice = createSlice({
  name: 'counter', // ์ด slice์˜ ์ด๋ฆ„
  initialState: { value: 0 }, // ์ดˆ๊ธฐ ์ƒํƒœ
  reducers: { // <-- ์—ฌ๊ธฐ์— 'reducers' (๋ณต์ˆ˜)๋ฅผ ์”๋‹ˆ๋‹ค!
    increment: (state) => { // 'increment'๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง„ ํ•˜๋‚˜์˜ 'reducer' (๋‹จ์ˆ˜) ํ•จ์ˆ˜
      state.value += 1;
    },
    decrement: (state) => { // 'decrement'๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง„ ๋˜ ๋‹ค๋ฅธ ํ•˜๋‚˜์˜ 'reducer' (๋‹จ์ˆ˜) ํ•จ์ˆ˜
      state.value -= 1;
    },
    // ... ๋” ๋งŽ์€ ์ž‘์€ reducer ํ•จ์ˆ˜๋“ค
  },
  // extraReducers: (builder) => { /* ์™ธ๋ถ€ ์•ก์…˜ ์ฒ˜๋ฆฌ */ }
});

// ์ด๋ ‡๊ฒŒ ์ •์˜๋œ 'reducers' ๊ฐ์ฒด ์•ˆ์— ์žˆ๋Š” 'increment'์™€ 'decrement'๊ฐ€
// ๊ฐ๊ฐ ํ•˜๋‚˜์˜ reducer ํ•จ์ˆ˜๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
export const { increment, decrement } = counterSlice.actions;

// ์ตœ์ข…์ ์œผ๋กœ ์™ธ๋ถ€๋กœ export๋  ๋•Œ,
// counterSlice.reducer๋Š” 'reducers' ์•ˆ์— ์ •์˜๋œ ๋ชจ๋“  ์ž‘์€ reducer ํ•จ์ˆ˜๋“ค์„
// ํ•˜๋‚˜๋กœ ํ•ฉ์ณ์ง„ ๊ฑฐ๋Œ€ํ•œ 'reducer' (๋‹จ์ˆ˜) ํ•จ์ˆ˜๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
export default counterSlice.reducer;