3 ๋ถ„ ์†Œ์š”


๐Ÿค” ์ œ๊ฐ€ useReducer ํ›…์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ์ž‘์„ฑํ•œ ๊ธ€ ์ž„๋‹ˆ๋‹ค,,

useReducer

๊ณต์‹ ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•˜๋ฉด โ€œuseReducer์€ ์ปดํฌ๋„ŒํŠธ์— reducer์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฆฌ์•กํŠธ์˜ ํ›…โ€ ์ด๋ ‡๊ฒŒ ์ •์˜ํ•˜๊ณ  ์žˆ๋‹ค.
useReducer๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชฉ์ ์€ ์„œ๋กœ ๊ด€๋ จ์ด ์žˆ๋Š” ์—ฌ๋Ÿฌ ์ƒํƒœ๋ฅผ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋กœ ๋ฌถ๊ณ , ํ•˜๋‚˜์˜ ํ•จ์ˆ˜(reducer) ์•ˆ์—์„œ ์–ด๋–ป๊ฒŒ ๋ฐ”๋€”์ง€๋ฅผ ์ •๋ฆฌํ•ด ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ์ด๋‹ค. ๊ฐ•์˜์—์„œ useState์—์„œ useReducer ๋ชจ๋‘ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ํ›…์„ ๋ณ€๊ฒฝํ•˜๋Š”๋ฐ ๊ทธ๋ ‡๋‹ค๋ฉด ์–ธ์ œ useState๋ฅผ ์“ฐ๊ณ , ์–ธ์ œ useReducer๋กœ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š”์ง€ ๊ธฐ์ค€์ด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ ๊ถ๊ธˆํ–ˆ๋‹ค.

useState, useReducer ์‚ฌ์šฉ ๊ธฐ์ค€

๋จผ์ € useState์™€ useReducer ๋™์ผํ•œ ๋ฐฉ์‹์ด๊ธฐ ๋•Œ๋ฌธ์— ์–ธ์ œ๋‚˜ ๋งˆ์Œ๋Œ€๋กœ ๋ฐ”๊ฟ”์„œ ์‚ฌ์šฉํ•ด๋„ ๋ฌด๋ฐฉํ•˜๋ฉฐ ๊ฐ™์€ ์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ ์„ž์–ด์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.

๊ธฐ์ค€ useReducer useState
์ƒํƒœ ์ˆ˜ ์ƒํƒœ๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ์ด๊ณ  ๋ณต์žกํ•  ๋•Œ ์ƒํƒœ๊ฐ€ 1~2๊ฐœ๋กœ ๋‹จ์ˆœํ•  ๋•Œ
์ƒํƒœ ๊ฐ„ ๊ด€๊ณ„ ์ƒํƒœ ๊ฐ’๋“ค์ด ์„œ๋กœ ์˜ํ–ฅ์„ ์ฃผ๊ณ ๋ฐ›๊ฑฐ๋‚˜,
ํ•œ ์•ก์…˜์ด ์—ฌ๋Ÿฌ ์ƒํƒœ๋ฅผ ๋™์‹œ์— ๋ฐ”๊ฟ”์•ผ ํ•  ๋•Œ
๊ฐ ์ƒํƒœ๊ฐ€ ๋…๋ฆฝ์ ์ผ ๋•Œ

์ข€ ๋” ๋ณต์žกํ•œ ์ƒํƒœ์ด๊ฑฐ๋‚˜ ์—ฌ๋Ÿฌ ์ƒํƒœ๋“ค๋ผ๋ฆฌ ์—ฐ๊ด€ ๋˜์–ด์žˆ์„ ๋•Œ setState๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ๋‚˜๋ˆ ์„œ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค useReducer๋กœ ๋ฌถ์–ด์„œ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒŒ ๋” ๊น”๋”ํ•˜๊ณ  ์œ ์ง€ ๋ณด์ˆ˜๊ฐ€ ์‰ฝ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์–ด ์ƒํ™ฉ์— ๋”ฐ๋ผ ์„ ํƒํ•ด ์‚ฌ์šฉํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค.

๐Ÿ”— useState ์™€ useReducer ๋น„๊ตํ•˜๊ธฐ



๐Ÿค”ย ๊ทธ๋Ÿฐ๋ฐ ์ปดํฌ๋„ŒํŠธ์— reducer์„ ์ถ”๊ฐ€ํ•œ๋‹ค๋Š” ๊ฒŒ ๋ฌด์Šจ ๋ง์ธ์ง€ ์™€๋‹ฟ์ง€ ์•Š์•˜๋‹ค.

useReducer ์—์„œ์˜ reducer ๋ž€?

reducer๋Š” ํ˜„์žฌ ์ƒํƒœ(state)์™€ ์•ก์…˜(action)์„ ์ธ์ˆ˜๋กœ ๋ฐ›์•„ ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
์ƒํƒœ๋ฅผ ์–ด๋–ป๊ฒŒ ๋ฐ”๊ฟ”์•ผ ํ• ์ง€๋ฅผ ์ •์˜ํ•ด๋‘๊ณ  action์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ํ•ด๋‹น action์„ ์‹คํ–‰ํ•ด ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค. ๋ฆฌ์•กํŠธ๋Š” reducer๊ฐ€ ๋ฐ˜ํ™˜ํ•œ ์ƒˆ ์ƒํƒœ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹ค์Œ state ๊ฐ’์„ ์„ค์ •ํ•˜๊ณ  ์ปดํฌ๋„ŒํŠธ๋ฅผ ์žฌ๋ Œ๋”๋ง ํ•œ๋‹ค.

import { useReducer } from "react";
//ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค ์ปดํฌ๋„ŒํŠธ ์•ˆ์˜ ํ•จ์ˆ˜๋“ค์ด ์žฌ์ƒ์„ฑ๋˜๋„๋ก ํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด์„œ ์ปดํฌ๋„ŒํŠธ ๋ฐ–์— ์ƒ์„ฑํ•œ๋‹ค.
//reducer๋Š” state, action๋งŒ ์ธ์ž๋กœ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ์ปดํฌ๋„ŒํŠธ ํ•จ์ˆ˜ ์•ˆ์—์„œ ์ •์˜๋˜๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธ๋˜๋Š” ์–ด๋–ค ๊ฐ’์—๋„ ์ง์ ‘ ์ ‘๊ทผํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.
function reducer(state, action) {
  //state: useReducer๋กœ ๊ด€๋ฆฌ๋˜๋Š” ์ƒํƒœ์˜ ๋ณด์žฅ๋œ ์ตœ์‹  ์ƒํƒœ ์Šค๋ƒ…์ƒท
  // ...
}

action : ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋–ค ํ–‰๋™์„ ํ–ˆ๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ’์œผ๋กœ ๋ชจ๋“  ํƒ€์ž…์ด ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ณดํ†ต ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉ
์˜ˆ๋ฅผ ๋“ค์–ด ๋”ํ•˜๊ธฐ ๋ฒ„ํŠผ ํด๋ฆญ โ†’ โ€œ์ˆซ์ž์— 1 ๋”ํ•ด์ค˜, ๋นผ๊ธฐ ๋ฒ„ํŠผ ํด๋ฆญ โ†’ โ€œ์ˆซ์ž์— 1 ๋นผ์ค˜โ€

//์ผ๋ฐ˜์ ์ธ action์˜ ๊ตฌ์„ฑ
{
  type: "increment", // ์–ด๋–ค ํ–‰๋™์ธ์ง€ ์•Œ๋ ค์ฃผ๋Š” ๋ฌธ์ž์—ด
  payload: 2, // ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ (์˜ต์…˜)
}

payload ์–ธ์ œ ์‚ฌ์šฉํ•ด์•ผํ• ๊นŒ?

action์„ ์ฒ˜๋ฆฌํ•  ๋•Œ, ๊ฐ’์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ payload๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด ํ•  ์ผ์„ ์ถ”๊ฐ€ํ•œ๋‹ค๋ฉด ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์— ๊ฐ’์„ ์ถ”๊ฐ€ํ•  ๋•Œ ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๊ฐ’์ด ํ•„์š”ํ•  ๋•Œ

function reducer(state, action) {
  if (action.type === "ADD_TODO") {
    return {
      ...state,
      todos: [...state.todos, action.payload],
    };
  }
  //...
}
dispatch({
  type: "ADD_TODO",
  payload: { id: 1, text: "ํ•  ์ผ ์ถ”๊ฐ€ํ•˜๊ธฐ" },
});

reducer ๋ฅผ ์ž‘์„ฑํ• ๋•Œ ์ง€์ผœ์•ผ ํ•˜๋Š” ๊ทœ์น™

  • ์˜ค์ง state์™€ action ์—๋งŒ ์˜์กดํ•˜๊ณ , โ€œ์ƒํƒœ๋ฅผ ์–ด๋–ป๊ฒŒ ๋ฐ”๊ฟ€์ง€โ€ ๋งŒ ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค.
  • reducer๋Š” ๋ถˆ๋ณ€์„ฑ์„ ์ง€์ผœ ๊ฐ์ฒด/๋ฐฐ์—ด์„ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค.
  • reducer๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜๊ฑฐ๋‚˜ ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ์ปดํฌ๋„ŒํŠธ ์™ธ๋ถ€๋กœ ๋ถ„๋ฆฌ ๊ฐ€๋Šฅํ•œ ์ˆœ์ˆ˜ ํ•จ์ˆ˜์—ฌ์•ผ ํ•œ๋‹ค (reducer ํ•จ์ˆ˜ ์•ˆ์—์„œ props, ref, useState, useEffect ์™€ ๊ฐ™์€ ์ปดํฌ๋„ŒํŠธ ์•ˆ์ชฝ์˜ ๊ฒƒ๋“ค์„ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ ๋œ๋‹ค)
  • ๊ฐ action์€ ๋ฐ์ดํ„ฐ ์•ˆ์—์„œ ์—ฌ๋Ÿฌ ๋ณ€๊ฒฝ๋“ค์ด ์žˆ๋”๋ผ๋„ ํ•˜๋‚˜์˜ ์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ์„ ์„ค๋ช…ํ•ด์•ผ ํ•œ๋‹ค.
    (์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž๊ฐ€ ํ•  ์ผ ์ถ”๊ฐ€ํ•˜๊ธฐ ๋ผ๋Š” ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด โ†’ todos ๋ฐฐ์—ด์— ์ƒˆ๋กœ์šด todo ์ถ”๊ฐ€, input๊ฐ’ ์ดˆ๊ธฐํ™”, input focus ์ด๋ ‡๊ฒŒ ๋ณ€๊ฒฝ๋˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ์—ฌ๋„ ํ•˜๋‚˜์˜ ์•ก์…˜์œผ๋กœ ๋ฌถ์–ด์„œ ์ฒ˜๋ฆฌ)

* ์ˆœ์ˆ˜ ํ•จ์ˆ˜(Pure Function) : ๊ฐ™์€ ์ž…๋ ฅ์„ ์ฃผ๋ฉด ํ•ญ์ƒ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ (์˜ˆ์ธก์ด ๊ฐ€๋Šฅํ•˜๊ณ ), ์™ธ๋ถ€ ์ƒํƒœ๋‚˜ sideEffect์— ์˜์กดํ•˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜
* ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ(Side-effect) : ํ•จ์ˆ˜๊ฐ€ ์ž์‹ ์˜ ์ผ ์™ธ์— ์ปดํฌ๋„ŒํŠธ ๋ฐ–์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ์ผ์„ ํ•˜๋Š” ๊ฒƒ


dispatch ํ•จ์ˆ˜

useReducer(reducer, initialArg, init?)
//์ฐธ๊ณ : init์ด ์žˆ์œผ๋ฉด initialArg๋ฅผ ๋ฐ”๋กœ state๋กœ ์“ฐ์ง€ ์•Š๊ณ , init์„ ํ•œ ๋ฒˆ ์‹คํ–‰ํ•ด์„œ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ดˆ๊ธฐ ์ƒํƒœ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

useReducer์— ์˜ํ•ด ๋ฐ˜ํ™˜๋˜๋Š” dispatch ํ•จ์ˆ˜๋Š” ์œ ์ผํ•œ ์ธ์ˆ˜์ธ ์•ก์…˜(action)์„ reducer ํ•จ์ˆ˜์— ์ „๋‹ฌํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.

function MyComponent() {
  const [state, dispatch] = useReducer(reducer, { count: 0 });
  // ...
}


useReducer ์‚ฌ์šฉ ์˜ˆ์‹œ

import { useReducer } from "react";

function reducer(state, action) {
  //ํ˜„์žฌ ์ƒํƒœ์™€ ์‚ฌ์šฉ์ž ์•ก์…˜์„ ์ „๋‹ฌ๋ฐ›์Œ
  switch (
    action.type //reducer์—์„œ ์ •์˜ํ•ด๋†“์€ ์•ก์…˜๋“ค
  ) {
    case "increment":
      return { count: state.count + 1 }; //์—…๋ฐ์ดํŠธ ๋œ ์ƒํƒœ๋ฅผ ๋ฐ˜ํ™˜
    case "decrement":
      return { count: state.count - 1 };
    default:
      return state;
  }
}
export default function CounterContextProvider({ children }) {
  const [state, dispatch] = useReducer(reducer, { count: 0 });
  return (
    <>
      <button
        onClick={() => {
          //dispach ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด reducer ํ•จ์ˆ˜์— action โ€œ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐฉ๊ธˆ ํ•œ ์ผโ€ ์ „๋‹ฌ
          dispatch({ type: "increment" });
        }}
      >
        Increment count
      </button>
      <button
        onClick={() => {
          dispatch({ type: "decrement" });
        }}
      >
        Increment count
      </button>
      <p>current count: {state.count}</p>
    </>
  );
}

๐Ÿ”— React_useReducer

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ