๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŒณ React

[React] StateHook(useState, useReducer) ์ •์˜์™€ ์‚ฌ์šฉ์˜ˆ์‹œ

by ._.sori 2026. 1. 12.

 

 

๋ฆฌ์•กํŠธ์˜ ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜๋‹ค.
๊ทธ๋Ÿฌ๋ฉด์„œ ์ž์—ฐ์Šค๋ ˆ Hook์— ๋Œ€ํ•ด ์•Œ๊ฒŒ๋˜์—ˆ๊ณ ,
React ์ฝ”๋“œ์˜ ๋Œ€๋ถ€๋ถ„์€ Hook์œผ๋กœ ์ด๋ค„์ง„ ๊ฑธ ์•Œ๊ฒŒ๋˜์—ˆ๋‹ค.
Hook์ด ๋ฌด์—‡์ธ์ง€, ์ž์„ธํ•˜๊ฒŒ ์•Œ์•„๋ณด์ž.

 

 

 

 

1. React Hook์˜ ๋“ฑ์žฅ ๋ฐฐ๊ฒฝ

  • ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ๋Š” ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์™€ ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ๋กœ ๋‚˜๋‰œ๋‹ค.
  • ๋ฆฌ์•กํŠธ ์ดˆ๊ธฐ์—๋Š” ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ–ˆ์œผ๋‚˜, ๊ฐ’์˜ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌ(state) ํ˜น์€ ์ƒ๋ช…์ฃผ๊ธฐ(์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ์‚ฌ๋ผ์ง€๋Š” ๊ณผ์ •)๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•  ๋•Œ๋งŒ ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.
  • ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ๋Š” ์ฝ”๋“œ์˜ ๊ตฌ์„ฑ์ด ์–ด๋ ต๊ณ  ์žฌ์‚ฌ์šฉ์„ฑ์ด ๋–จ์–ด์ง„๋‹ค. ์ฝ”๋“œ ์ตœ์ ํ™”๋„ ์–ด๋ ต๊ณ  ์ตœ์‹  ๊ธฐ์ˆ  ์‚ฌ์šฉ๋„ ํšจ๊ณผ์ ์ด์ง€ ์•Š๋‹ค.
  • ๊ทธ๋ž˜์„œ ์ด๋Ÿฐ ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์˜ ๋‹จ์ ์„ ๋ณด์•ˆํ•˜๋ฉด์„œ, ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋“ฑ์žฅํ•œ ๊ฒƒ์ด ๋ฐ”๋กœ React Hook(๋ฆฌ์•กํŠธ ํ›…)์ด๋‹ค.

 

 


 

 

 

2. React Hook

  • ๋ฆฌ์•กํŠธ v16.8์— ์ƒˆ๋กœ ๋„์ž…๋œ ๊ธฐ๋Šฅ์œผ๋กœ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ช‡๊ฐ€์ง€ ๊ธฐ์ˆ ๋“ค์„ ์ผ์ปซ๋Š”๋‹ค.
  • ๋ฆฌ์•กํŠธ ํ›…์€ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค.
  • ์ฃผ๋กœ ๋Œ€ํ‘œ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด useEffect, useState ๋“ฑ์ด ์žˆ๋‹ค.

 

 

 


 

 

 

3. State Hook

  • State๋ฅผ ํ†ตํ•ด ์ปดํฌ๋„ŒํŠธ๋Š” ์‚ฌ์šฉ์ž ์ž…๋ ฅ๊ณผ ๊ฐ™์€ ์ •๋ณด๋ฅผ ๊ธฐ์–ตํ•  ์ˆ˜ ์žˆ๋‹ค. 

  • [ useState ]
    a)
    useState๋Š” ์ปดํฌ๋„ŒํŠธ์— state ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.
    b) ๋ฐฐ์—ด ๊ตฌ์กฐ ๋ถ„ํ•ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ [somethig, setSomething]๊ณผ ๊ฐ™์€ state ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•ด์•ผํ•œ๋‹ค.
    c) ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด age์™€ name์ด ํ˜„์žฌ state๊ฐ€ ๋œ๋‹ค. ๋งŒ์•ฝ ๋ณ€๋™์‚ฌํ•ญ์ด ์—†์—ˆ๋‹ค๋ฉด ์ดˆ๊ธฐ๊ฐ’์ด ๋“ค์–ด๊ฐ„๋‹ค. ๊ทธ๋ฆฌ๊ณ  setAge์™€ setName์ด ์ƒํ˜ธ์ž‘์šฉ์— ๋ฐ˜์‘ํ•˜์—ฌ ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” set ํ•จ์ˆ˜๊ฐ€ ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  42์™€ Taylor๊ฐ€ ์ดˆ๊ธฐ๊ฐ’์ด ๋œ๋‹ค.
import { useState } from 'react';

function MyComponent() {
  const [age, setAge] = useState(42);
  const [name, setName] = useState('Taylor');


       d) setName์— Robin์„ ๋„ฃ์—ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๊ทธ ๋‹ค์Œ ๋ Œ๋”๋ถ€ํ„ฐ name ๊ฐ’์ด 'Taylor'์—์„œ 'Robin'์œผ๋กœ ๋ฐ”๋€๋‹ค.
       e) ์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ๊ฒƒ์€ setName์€ ์ฆ‰์‹œ name์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, ๋‹ค์Œ ๋ Œ๋”๋ฅผ ์˜ˆ์•ฝํ•œ๋‹ค.

       f) ๊ทธ๋ž˜์„œ ๋ฐ”๋€ ๊ฐ’์„ ํ™•์ธํ•˜๋ ค๋ฉด useEffect([name])์ฒ˜๋Ÿผ ๋ Œ๋” ์ดํ›„ ํƒ€์ด๋ฐ์—์„œ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.

 

useEffect(() => {
  console.log("์ด์ œ name์€:", name);
}, [name]);

 

 

 

  • [ useReducer ]
    a) useReducer๋Š” ์ปดํฌ๋„ŒํŠธ์— reducer๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” React Hook์ด๋‹ค.
    b) ์ƒํƒœ๋ฅผ ๋ฐ”๊พธ๋Š” ๊ทœ์น™(๋กœ์ง)์„ ํ•œ ๊ณณ์— ๋ชจ์•„๋‘๊ณ  ์ด๋ฒคํŠธ(์•ก์…˜)๊ฐ€ ์˜ค๋ฉด ๊ทธ ๊ทœ์น™๋Œ€๋กœ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.
    c) useState๋Š” ์ƒํƒœ๋ฅผ ํ•˜๋‚˜๋งŒ ๋ฐ”๊ฟ€ ๋•Œ ์“ฐ๊ธฐ ์ข‹๋‹ค๋ฉด, useReducer์€ ์ƒํƒœ๊ฐ€ ๋ณต์žกํ•ด์งˆ ๋•Œ ์‚ฌ์šฉํ•˜๊ธฐ ์ข‹๋‹ค.
    d) ์ฝ”๋“œ์— ์ ํžŒ ์„ค๋ช…์„ ์ฝ์–ด๋ณด์ž! ์ฝ”๋“œ ํ๋ฆ„์„ ๋‹ค์‹œ ์ •๋ฆฌํ•ด๋ณด๋ฉด, ( - ) ๋ฒ„ํŠผ์„ ํด๋ฆญ{type : "dec" } action ๊ฐ์ฒด ๋ฐฐ๋‹ฌ  → ํ˜„์žฌ๊ฐ’์—์„œ -1 ๊ณ„์‚ฐ  → state ์ƒํƒœ๊ฐ€ ์—…๋ฐ์ดํŠธ ๋จ  → ๋ฆฌ๋ Œ๋”๋งํ•˜๋ฉด์„œ ํ™”๋ฉด์˜ ์ˆซ์ž๊ฐ€ ๋ณ€๊ฒฝ๋จ
import { useReducer } from "react";

const initialState = { count: 0 };

function reducer(state, action) {
  // 3.
  // ์—ฌ๊ธฐ์— action์ด ์™”๊ณ , action์—๋Š” type์ด ์žˆ๋‹ค.
  // ์•„๊นŒ ์•„๋ž˜ํ•ด์„œ dec๋ฅผ ๋ณด๋ƒˆ์œผ๋‹ˆ ํ˜„์žฌ๊ฐ’์—์„œ -1์„ ํ•œ ๊ฐ’์ด ๋ฆฌ๋ Œ๋”๋ง ๋  ๊ฒƒ์ด๋‹ค.
  // ๊ทธ๋Ÿผ 0์ด ํ˜„์žฌ ์ƒํƒœ์˜€์œผ๋‹ˆ -1์ด๋ผ๋Š” ์ƒˆ๋กœ์šด ๊ฐ’์ด ๋ฐ˜ํ™˜๋˜์–ด ๋ฆฌ๋ Œ๋”๋ง๋œ๋‹ค.
  switch (action.type) {
    case "inc":
      return { count: state.count + 1 };
    case "dec":
      return { count: state.count - 1 };
    case "reset":
      return initialState;
    default:
      return state;
  }
}

export default function Counter() {
  // 1.
  // state๋Š” ์ƒํƒœ์ด๋ฉฐ, ์ฒซ๋ฒˆ์งธ ๋žœ๋”๋ง์—์„œ๋Š” ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ ์„ค์ •๋œ๋‹ค.
  // dispatch๋Š” state๋ฅผ ์ƒˆ๋กœ์šด ๊ฐ’์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ๋ฆฌ๋ Œ๋”๋งํ•œ๋‹ค. 
  // dispatch์˜ ์œ ์ผํ•œ ์ธ์ˆ˜๋Š” action์ด๋‹ค.
  // ๋งจ ์œ— ์ค„์„ ๋ณด๋ฉด initialState๋ฅผ ์„ค์ •ํ•œ ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค. 
  const [state, dispatch] = useReducer(reducer, initialState);

  return (
    <div>
      // 2.
      // ์˜ˆ๋ฅผ ๋“ค์–ด - ๋ฒ„ํŠผ์„ ํด๋ฆญํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.
      // ๊ทธ๋Ÿฌ๋ฉด dispatch์˜ action.type์€ "dec"๊ฐ€ ๋œ๋‹ค.
      // ์ด๋•Œ {type: "dec"}๊ฐ€ action์˜ ๊ฐ์ฒด์ด๋ฉฐ ์ด ๊ฐ์ฒด ๊ทธ๋Œ€๋กœ reducer ํ•จ์ˆ˜๋กœ ๋„˜๊ฒจ์ง„๋‹ค. 
      <button onClick={() => dispatch({ type: "dec" })}> - </button>
      <span style={{ padding: 8 }}>{state.count}</span>
      <button onClick={() => dispatch({ type: "inc" })}> + </button>
      <button onClick={() => dispatch({ type: "reset" })}> reset </button>
    </div>
  );
}

 

 

 

 

 


 

- react hooks

 

๋‚ด์žฅ React Hook – React

The library for web and native user interfaces

ko.react.dev

 

 

 

- useState

 

useState – React

The library for web and native user interfaces

ko.react.dev

 

 

 

- useReducer

 

useReducer – React

The library for web and native user interfaces

ko.react.dev