Redux

Redux

๋ฆฌ๋•์Šค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ค‘์•™์˜ store ์—์„œ ๊ด€๋ฆฌํ•˜์—ฌ ์ „์—ญ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌ ํ• ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ฃผ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค ์‚ฌ์šฉํ•˜๋ฉด์„œ ๋ฆฌ๋•์Šค๊ฐ€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ์•„์ง 100% ์ดํ•ดํ•˜์ง€ ๋ชปํ•œ๊ฒƒ ๊ฐ™์•„์„œ ์ด๋ฒˆ ๊ธฐํšŒ์— ๊ณต๋ถ€ํ•ด๋ณด์ž

๋ฆฌ๋•์Šค์—์„œ ์•Œ์•„์•ผ ํ•  ํ•ต์‹ฌ ํ‚ค์›Œ๋“œ๋Š” store,reducer, action, dispatch ์ด๋‹ค.


store ๋Š” ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ณณ์ด๋‹ค. ์ด๊ณณ์—์„œ ์ „์—ญ์œผ๋กœ ์‚ฌ์šฉํ•  ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š”๋ฐ, ์ปดํฌ๋„ŒํŠธ์—์„œ ์–ด๋– ํ•œ ์ƒํƒœ๋ฅผ ์กฐํšŒํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด useSelector๋ฅผ ์‚ฌ์šฉํ•ด store์— ์ ‘๊ทผํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์–ป๋Š”๋‹ค. (์œ ์˜ํ•  ์ ์€ ํ•˜๋‚˜์˜ ์ƒํƒœ๋Š” ํ•˜๋‚˜์˜ store๊ฐ€ ๊ด€๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.)

**action**์€ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ• ๋•Œ "์ด ์ƒํƒœ๋ฅผ ์ด๋ ‡๊ฒŒ ๋ณ€๊ฒฝ ํ• ๊ฑฐ์•ผ" ๋ผ๊ณ  ์•Œ๋ ค์ฃผ๋Š” ๊ฒƒ์ด๋‹ค. ๊ฐ์ฒด๋กœ ํ‘œํ˜„๋˜๊ณ , ์ด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์•ก์…˜ ์ƒ์„ฑ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•œ๋‹ค. ๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ๋ฅผ ๋ณด์ž.

const ADD_NUM = "ADD_NUM";
const MINUS_NUM = "MINUS_NUM";

function isAdd() {
  return {
    type: ADD_NUM,
  };
}

function isMinus() {
  return {
    type: MINUS_NUM,
  };
}

์ตœ์ดˆ ์•ก์…˜์˜ ํƒ€์ž…์„ ์ •์˜ํ•˜๊ณ , isAdd๋ผ๋Š” ์•ก์…˜ ์ƒ์„ฑ ํ•จ์ˆ˜์—์„œ ์•ก์…˜ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. (ํƒ€์ž… ์„ ์–ธ ๋ถ€๋ถ„์€ ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•ด๋„ ๋˜์ง€๋งŒ, ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•ด ์‹ค์ˆ˜๋ฅผ ์ค„์ด๋Š” ๊ฒƒ์ด ๋‚˜์•„๋ณด์ธ๋‹ค.)

๊ทธ๋Ÿฐ๋ฐ ์–ด๋–ป๊ฒŒ ๋ฐ”๊ฟ€๊ฒƒ์ธ์ง€๋Š” ์ •ํ–ˆ๋Š”๋ฐ ์ด๊ฑธ ์–ด๋””์„œ ์ฒ˜๋ฆฌํ•ด์ฃผ์ง€?๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ ๋‹ค. ์ด ์žฅ์†Œ๊ฐ€ ๋ฐ”๋กœ **reducer**์ด๋‹ค.

const initialState = {
  num: 0,
};

function CounterReducer(state = initialState, action) {
  switch (action.type) {
    case ADD_NUM:
      return {
        ...state,
        num: state.num + 1,
      };
    case MINUS_NUM:
      return {
        ...state,
        num: state.num - 1,
      };
    default:
      return { ...state };
  }
}

reducer๋Š” ์ƒ์„ฑํ•œ ์•ก์…˜์„ ์ „๋‹ฌ๋ฐ›์•„ store์— ์žˆ๋Š” ํ˜„์žฌ ์ƒํƒœ๋ฅผ ์•ก์…˜์˜ ๋‚ด์šฉ๋Œ€๋กœ ์—…๋ฐ์ดํŠธ ํ•ด์ค€๋‹ค. ์—ฌ๊ธฐ์„œ, ์•ก์…˜์„ reducer๋กœ ์ „๋‹ฌํ•˜๋Š” ์—ญํ• ์„ ํ•ด์ฃผ๋Š”๊ฒƒ์ด ๋ฐ”๋กœ dispatch ์ธ ๊ฒƒ์ด๋‹ค.

import { useDispatch, useSelector } from "react-redux";
import { isAdd, isMinus } from "./CounterReducer";
import React from "react";

const Counter = () => {
  const count = useSelector((state) => state.num);
  // dispatch๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•ก์…˜์„ ๋ฆฌ๋“€์„œ์— ์ „๋‹ฌํ•œ๋‹ค.
  const dispatch = useDispatch();

  return (
    <div>
      <h1>{count} </h1>
      <br />
      <button onClick={() => dispatch(isAdd())}> + </button>
      <button onClick={() => dispatch(isMinus())}> - </button>
    </div>
  );
};

export default Counter;

๊ทธ๋Ÿผ ํ•œ๋ฒˆ ๊ณผ์ •์„ ์ •๋ฆฌํ•ด๋ณด์ž.

๋จผ์ €, ์ƒํƒœ๋ฅผ ์–ด๋–ป๊ฒŒ ๋ฐ”๊ฟ€๊ฒƒ์ธ์ง€์— ๋Œ€ํ•œ ์•ก์…˜๊ฐ์ฒด๊ฐ€ ์•ก์…˜ ์ƒ์„ฑ ํ•จ์ˆ˜๋กœ๋ถ€ํ„ฐ ์ƒ์„ฑ๋œ๋‹ค. ๋งŒ๋“ค์–ด์ง„ ์•ก์…˜ ๊ฐ์ฒด๋Š” dispatch๋ฅผ ํ†ตํ•ด์„œ reducer๋กœ ์ „๋‹ฌ๋˜๋Š”๋ฐ, reducer์—์„  ๋ฐ›์•„์˜จ ์•ก์…˜๊ฐ์ฒด๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ๋งŒ๋“ค์–ด store์— ์ €์žฅํ•œ๋‹ค.

๋ผ๋Š” ๊ณผ์ •์„ ๊ฐ€์ง€๋Š” ๊ฒƒ์ด๋‹ค.

Last updated