๐Ÿ“Œ State Hook

๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ๊ฐ’์ด ์ฆ๊ฐ€ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์นด์šดํ„ฐ ์˜ˆ์‹œ์ด๋‹ค.

import React, { useState } from 'react';

function Example() {
  // "count"๋ผ๋Š” ์ƒˆ ์ƒํƒœ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•œ๋‹ค
  const [count, setCount] = useState(0);

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </div>
  );
}

์—ฌ๊ธฐ์„œ useState๊ฐ€ ๋ฐ”๋กœ Hook์ด๋‹ค. Hook์„ ํ˜ธ์ถœํ•ด ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ(function component) ์•ˆ์— state๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค. ์ด state๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‹ค์‹œ ๋ Œ๋”๋ง ๋˜์–ด๋„ ๊ทธ๋Œ€๋กœ ์œ ์ง€๋œ๋‹ค. useState๋Š” ํ˜„์žฌ์˜ state ๊ฐ’๊ณผ ์ด ๊ฐ’์„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์Œ์œผ๋กœ ์ œ๊ณตํ•œ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด ํ•จ์ˆ˜๋ฅผ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋‚˜ ๋‹ค๋ฅธ ๊ณณ์—์„œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๊ฒƒ์€ class์˜ this.setState์™€ ๊ฑฐ์˜ ์œ ์‚ฌํ•˜์ง€๋งŒ, ์ด์ „ state์™€ ์ƒˆ๋กœ์šด state๋ฅผ ํ•ฉ์น˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ฐจ์ด์ ์ด ์žˆ๋‹ค.

useState๋Š” ์ด๋‹ˆ์ž๋กœ ์ดˆ๊ธฐ state ๊ฐ’์„ ํ•˜๋‚˜ ๊ฐ€์ง„๋‹ค. ์นด์šดํ„ฐ๋Š” 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์œ„ ์˜ˆ์‹œ์—์„œ๋Š” ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ 0์„ ๋„ฃ์–ด์ค€ ๊ฒƒ์ด๋‹ค. this.state์™€๋Š” ๋‹ฌ๋ฆฌ setState Hook์˜ state๋Š” ๊ฐ์ฒด์ผ ํ•„์š”๊ฐ€ ์—†๋‹ค. ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์ด์•ผ๊ธฐ๋Š” ์•„๋‹ˆ๋‹ค. ์ด ์ดˆ๊ธฐ๊ฐ’์€ ์ฒซ ๋ฒˆ์งธ ๋ Œ๋”๋ง์—๋งŒ ๋”ฑ ํ•œ๋ฒˆ ์‚ฌ์šฉ๋œ๋‹ค.

์—ฌ๋Ÿฌ state ๋ณ€์ˆ˜ ์„ ์–ธํ•˜๊ธฐ

ํ•˜๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ State Hook์„ ์—ฌ๋Ÿฌ ๊ฐœ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

function ExampleWithManyStates() {
  // ์ƒํƒœ ๋ณ€์ˆ˜๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ์„ ์–ธํ–ˆ๋‹ค
  const [age, setAge] = useState(42);
  const [fruit, setFruit] = useState('banana');
  const [todos, setTodos] = useState([{ text: 'Learn Hooks' }]);
  // ...
}

๋ฐฐ์—ด ๊ตฌ์กฐ ๋ถ„ํ•ด(destructuring) ๋ฌธ๋ฒ•์€ useSate๋กœ ํ˜ธ์ถœ๋œ state ๋ณ€์ˆ˜๋“ค์„ ๋‹ค๋ฅธ ๋ณ€์ˆ˜๋ช…์œผ๋กœ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค. ์ด ๋ณ€์ˆ˜๋ช…์€ useState API์™€ ๊ด€๋ จ์ด ์—†๋‹ค. ๋Œ€์‹  React๋Š” ๋งค๋ฒˆ ๋ Œ๋”๋งํ•  ๋•Œ useState๊ฐ€ ์‚ฌ์šฉ๋œ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰ํ•œ๋‹ค.

๊ทผ๋ฐ Hook์ด ๋ญ”๊ฐ€์š”?

Hook์€ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์—์„œ React state์™€ ์ƒ๋ช…์ฃผ๊ธฐ ๊ธฐ๋Šฅ(lifecycle features)์„ "์—ฐ๋™(hook into)"ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜์ด๋‹ค. Hook์€ class ์•ˆ์—์„œ๋Š” ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•œ๋‹ค. ๋Œ€์‹  class ์—†์ด React๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

React๋Š” useState ๊ฐ™์€ ๋‚ด์žฅ Hook์„ ๋ช‡ ๊ฐ€์ œ ์ œ๊ณตํ•œ๋‹ค. ์ปดํฌ๋„ŒํŠธ ๊ฐ„์— ์ƒํƒœ ๊ด€๋ จ ๋กœ์ง์„ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด Hook์„ ์ง์ ‘ ๋งŒ๋“œ๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.


โšก๏ธ Effect Hook

React ์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ๊ตฌ๋…ํ•˜๊ณ , DOM์„ ์ง์ ‘ ์กฐ์ž‘ํ•˜๋Š” ์ž‘์—…์„ ์ด์ „์—๋„ ์ข…์ข… ํ•ด๋ดค์„ ๊ฒƒ์ด๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋Ÿฐ ๋ชจ๋“  ๋™์ž‘์€ "side effect"(๋˜๋Š” ์งง๊ฒŒ "effect")๋ผ๊ณ  ํ•œ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ด๊ฒƒ์€ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๊ณ , ๋ Œ๋”๋ง ๊ณผ์ •์—์„œ๋Š” ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†๋Š” ์ž‘์—…์ด๊ธฐ ๋–„๋ฌธ์ด๋‹ค.

Effect Hook, ์ฆ‰ useEffect๋Š” ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ์ด๋Ÿฐ side effects๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค. React class์˜ componentDidMount ๋‚˜ componentDidUpdate, componentWillUnmount ์™€ ๊ฐ™์€ ๋ชฉ์ ์œผ๋กœ ์ œ๊ณต๋˜์ง€๋งŒ, ํ•˜๋‚˜์˜ API๋กœ ํ†ตํ•ฉ๋œ ๊ฒƒ์ด๋‹ค. (useEffect ์™€ ์„ธ ๊ฐ€์ง€ ๋ฉ”์„œ๋“œ๋ฅผ ๋น„๊ตํ•˜๋Š” ์˜ˆ์‹œ๋Š” Using the Effect Hook ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ )