Using the State Hook
Hook์ React 16.8๋ฒ์ ์ ์๋ก ์ถ๊ฐ๋์์ต๋๋ค. Hook์ ํด๋์ค ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ์ง ์์๋ state์ ๊ฐ์ ํน์ง๋ค์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Hook ์๊ฐ์์ ์๋ ์์๋ฅผ ํตํด Hook๊ณผ ์นํด์ก์ต๋๋ค.
import React, { useState } from 'react';
function Example() {
  // ์๋ก์ด state ๋ณ์๋ฅผ ์ ์ธํ๊ณ , count๋ผ ๋ถ๋ฅด๊ฒ ์ต๋๋ค.  const [count, setCount] = useState(0);
  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </div>
  );
}์๋์ ํด๋์ค ์์์ ๋น๊ตํ๋ฉฐ Hook์ ํน์ง์ ๋ํด ๋ฐฐ์ธ ์์ ์ ๋๋ค.
Hook๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ํ๋ ํด๋์ค ์์
React์์ ํด๋์ค๋ฅผ ์ฌ์ฉํด๋ดค๋ค๋ฉด, ์๋์ ์ฝ๋๋ ์ต์ํ ๊ฒ๋๋ค.
class Example extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      count: 0
    };
  }
  render() {
    return (
      <div>
        <p>You clicked {this.state.count} times</p>
        <button onClick={() => this.setState({ count: this.state.count + 1 })}>
          Click me
        </button>
      </div>
    );
  }
}์ ์ฝ๋์์ state๋ { count: 0 }์ด๋ฉฐ ์ฌ์ฉ์๊ฐ this.setState()๋ฅผ ํธ์ถํ๋ ๋ฒํผ์ ํด๋ฆญํ์ ๋ state.count๋ฅผ ์ฆ๊ฐ์ํต๋๋ค. ์์ ํด๋์ค ์์๋ฅผ ํด๋น ํ์ด์ง์์ ๊ณ์ ์ฌ์ฉํ  ์์ ์
๋๋ค.
์ฃผ์
์ข ๋ ํ์ค์ ์ธ ์์๊ฐ ์๋, counter ์์๋ฅผ ์ฌ์ฉํ๋์ง ๊ถ๊ธํ ์ ์์ต๋๋ค. counter ์์๋ฅผ ์ฌ์ฉํ ์ด์ ๋, Hook์ ์ ์ดํดํ ์ ์๋๋ก ๋์์ฃผ๋ ๊ฐ์ฅ ๊ธฐ์ด์ ์ธ ๋ด์ฉ์ด ๋ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
Hook๊ณผ ํจ์ ์ปดํฌ๋ํธ
React์ ํจ์ ์ปดํฌ๋ํธ๋ ์ด๋ ๊ฒ ์๊ฒผ์ต๋๋ค.
const Example = (props) => {
  // ์ฌ๊ธฐ์ Hook์ ์ฌ์ฉํ  ์ ์์ต๋๋ค!
  return <div />;
}๋๋ ์ด๋ ๊ฒ ์๊ฒผ์ต๋๋ค.
function Example(props) {
  // ์ฌ๊ธฐ์ Hook์ ์ฌ์ฉํ  ์ ์์ต๋๋ค!
  return <div />;
}ํจ์ ์ปดํฌ๋ํธ๋ฅผ โstate๊ฐ ์๋ ์ปดํฌ๋ํธโ๋ก ์๊ณ ์์์ ๊ฒ๋๋ค. ํ์ง๋ง Hook์ React state๋ฅผ ํจ์ ์์์ ์ฌ์ฉํ ์ ์๊ฒ ํด์ค๋๋ค.
Hook์ ํด๋์ค ์์์ ๋์ํ์ง ์์ต๋๋ค. ํ์ง๋ง ํด๋์ค๋ฅผ ์์ฑํ์ง ์๊ณ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Hook์ด๋?
React์ useState Hook์ ์ฌ์ฉํด๋ด
์๋ค!
import React, { useState } from 'react';
function Example() {
  // ...
}Hook์ด๋? Hook์ ํน๋ณํ ํจ์์
๋๋ค. ์๋ฅผ ๋ค์ด useState๋ state๋ฅผ ํจ์ ์ปดํฌ๋ํธ ์์์ ์ฌ์ฉํ  ์ ์๊ฒ ํด์ค๋๋ค. ๋ค๋ฅธ Hook๋ค์ ๋์ค์ ์ดํด๋ด
์๋ค!
์ธ์  Hook์ ์ฌ์ฉํ ๊น? ํจ์ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ ์ค state๋ฅผ ์ถ๊ฐํ๊ณ ์ถ์ ๋ ํด๋์ค ์ปดํฌ๋ํธ๋ก ๋ฐ๊พธ๊ณค ํ์ ๊ฒ๋๋ค. ํ์ง๋ง ์ด์  ํจ์ ์ปดํฌ๋ํธ ์์์ Hook์ ์ด์ฉํ์ฌ state๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ฃผ์
์ปดํฌ๋ํธ ์์์ Hook์ ์ฌ์ฉํ ๋ ๋ช ๊ฐ์ง ํน๋ณํ ๊ท์น์ด ์์ต๋๋ค. ๋์ค์ Hook์ ๊ท์น์์ ์ดํด๋ณด๋๋ก ํ ๊ฒ์!
state ๋ณ์ ์ ์ธํ๊ธฐ
ํด๋์ค๋ฅผ ์ฌ์ฉํ  ๋, constructor ์์์ this.state๋ฅผ { count: 0 }๋ก ์ค์ ํจ์ผ๋ก์จ count๋ฅผ 0์ผ๋ก ์ด๊ธฐํํ์ต๋๋ค.
class Example extends React.Component {
  constructor(props) {
    super(props);
    this.state = {      count: 0    };  }ํจ์ ์ปดํฌ๋ํธ๋ this๋ฅผ ๊ฐ์ง ์ ์๊ธฐ ๋๋ฌธ์ this.state๋ฅผ ํ ๋นํ๊ฑฐ๋ ์ฝ์ ์ ์์ต๋๋ค. ๋์ , useState Hook์ ์ง์  ์ปดํฌ๋ํธ์ ํธ์ถํฉ๋๋ค.
import React, { useState } from 'react';
function Example() {
  // ์๋ก์ด state ๋ณ์๋ฅผ ์ ์ธํ๊ณ , ์ด๊ฒ์ count๋ผ ๋ถ๋ฅด๊ฒ ์ต๋๋ค.  const [count, setCount] = useState(0);useState๋ฅผ ํธ์ถํ๋ ๊ฒ์ ๋ฌด์์ ํ๋ ๊ฑธ๊น์? โstate ๋ณ์โ๋ฅผ ์ ์ธํ  ์ ์์ต๋๋ค. ์์ ์ ์ธํ ๋ณ์๋ count๋ผ๊ณ  ๋ถ๋ฅด์ง๋ง banana์ฒ๋ผ ์๋ฌด ์ด๋ฆ์ผ๋ก ์ง์ด๋ ๋ฉ๋๋ค. useState๋ ํด๋์ค ์ปดํฌ๋ํธ์ this.state๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ฅ๊ณผ ๋๊ฐ์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ผ๋ฐ ๋ณ์๋ ํจ์๊ฐ ๋๋  ๋ ์ฌ๋ผ์ง์ง๋ง, state ๋ณ์๋ React์ ์ํด ์ฌ๋ผ์ง์ง ์์ต๋๋ค.
useState์ ์ธ์๋ก ๋ฌด์์ ๋๊ฒจ์ฃผ์ด์ผ ํ ๊น์? useState()Hook์ ์ธ์๋ก ๋๊ฒจ์ฃผ๋ ๊ฐ์ state์ ์ด๊ธฐ ๊ฐ์
๋๋ค. ํจ์ ์ปดํฌ๋ํธ์ state๋ ํด๋์ค์ ๋ฌ๋ฆฌ ๊ฐ์ฒด์ผ ํ์๋ ์๊ณ , ์ซ์ ํ์
๊ณผ ๋ฌธ์ ํ์
์ ๊ฐ์ง ์ ์์ต๋๋ค. ์์ ์์๋ ์ฌ์ฉ์๊ฐ ๋ฒํผ์ ์ผ๋ง๋ ๋ง์ด ํด๋ฆญํ๋์ง ์๊ธฐ๋ฅผ ์ํ๋ฏ๋ก 0์ ํด๋น state์ ์ด๊ธฐ ๊ฐ์ผ๋ก ์ ์ธํ์ต๋๋ค. (2๊ฐ์ ๋ค๋ฅธ ๋ณ์๋ฅผ ์ ์ฅํ๊ธฐ๋ฅผ ์ํ๋ค๋ฉด useState()๋ฅผ ๋ ๋ฒ ํธ์ถํด์ผ ํฉ๋๋ค.)
useState๋ ๋ฌด์์ ๋ฐํํ ๊น์? state ๋ณ์, ํด๋น ๋ณ์๋ฅผ ๊ฐฑ์ ํ  ์ ์๋ ํจ์ ์ด ๋ ๊ฐ์ง ์์ ๋ฐํํฉ๋๋ค. ์ด๊ฒ์ด ๋ฐ๋ก const [count, setCount] = useState()๋ผ๊ณ  ์ฐ๋ ์ด์ ์
๋๋ค. ํด๋์ค ์ปดํฌ๋ํธ์ this.state.count์ this.setState์ ์ ์ฌํฉ๋๋ค. ๋ง์ฝ ์ด๋ฌํ ๋ฌธ๋ฒ์ ์ต์ํ์ง ์๋ค๋ฉด ํ์ฌ ํ์ด์ง์ ๋์์ ์ดํด๋ณผ๊ฒ์.
์ด์  useState๋ฅผ ์ด์ฉํ์ฌ ๋ง์ ๊ฒ์ ๋ง๋ค ์ ์์ต๋๋ค.
import React, { useState } from 'react';
function Example() {
  // ์๋ก์ด state ๋ณ์๋ฅผ ์ ์ธํ๊ณ , ์ด๊ฒ์ count๋ผ ๋ถ๋ฅด๊ฒ ์ต๋๋ค.  const [count, setCount] = useState(0);count๋ผ๊ณ  ๋ถ๋ฅด๋ state ๋ณ์๋ฅผ ์ ์ธํ๊ณ  0์ผ๋ก ์ด๊ธฐํํฉ๋๋ค. React๋ ํด๋น ๋ณ์๋ฅผ ๋ฆฌ๋ ๋๋งํ  ๋ ๊ธฐ์ตํ๊ณ , ๊ฐ์ฅ ์ต๊ทผ์ ๊ฐฑ์ ๋ ๊ฐ์ ์ ๊ณตํฉ๋๋ค. count ๋ณ์์ ๊ฐ์ ๊ฐฑ์ ํ๋ ค๋ฉด setCount๋ฅผ ํธ์ถํ๋ฉด ๋ฉ๋๋ค.
์ฃผ์
์
createState๊ฐ ์๋,useState๋ก ์ด๋ฆ์ ์ง์์๊น์?์ปดํฌ๋ํธ๊ฐ ๋ ๋๋งํ ๋ ์ค์ง ํ ๋ฒ๋ง ์์ฑ๋๊ธฐ ๋๋ฌธ์ โCreateโ๋ผ๋ ์ด๋ฆ์ ๊ฝค ์ ํํ์ง ์์ ์ ์์ต๋๋ค. ์ปดํฌ๋ํธ๊ฐ ๋ค์ ๋ ๋๋ง์ ํ๋ ๋์
useState๋ ํ์ฌ state๋ฅผ ์ค๋๋ค. Hook ์ด๋ฆ์ด ํญ์use๋ก ์์ํ๋ ์ด์ ๋ ์์ต๋๋ค. Hook์ ๊ท์น์์ ๋์ค์ ์ดํด๋ณด๋๋ก ํ ๊ฒ์.
state ๊ฐ์ ธ์ค๊ธฐ
ํด๋์ค ์ปดํฌ๋ํธ๋ count๋ฅผ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด this.state.count๋ฅผ ์ฌ์ฉํฉ๋๋ค.
  <p>You clicked {this.state.count} times</p>๋ฐ๋ฉด ํจ์ ์ปดํฌ๋ํธ๋ count๋ฅผ ์ง์  ์ฌ์ฉํ  ์ ์์ต๋๋ค.
  <p>You clicked {count} times</p>state ๊ฐฑ์ ํ๊ธฐ
ํด๋์ค ์ปดํฌ๋ํธ๋ count๋ฅผ ๊ฐฑ์ ํ๊ธฐ ์ํด this.setState()๋ฅผ ํธ์ถํฉ๋๋ค.
  <button onClick={() => this.setState({ count: this.state.count + 1 })}>    Click me
  </button>๋ฐ๋ฉด ํจ์ ์ปดํฌ๋ํธ๋ setCount์ count ๋ณ์๋ฅผ ๊ฐ์ง๊ณ  ์์ผ๋ฏ๋ก this๋ฅผ ํธ์ถํ์ง ์์๋ ๋ฉ๋๋ค.
  <button onClick={() => setCount(count + 1)}>    Click me
  </button>์์ฝ
์๋ ์ฝ๋๋ฅผ ํ ์ค ํ ์ค ์ดํด๋ณด๊ณ , ์ผ๋ง๋ ์ดํดํ๋์ง ์ฒดํฌํด๋ด ์๋ค.
 1:  import React, { useState } from 'react'; 2:
 3:  function Example() {
 4:    const [count, setCount] = useState(0); 5:
 6:    return (
 7:      <div>
 8:        <p>You clicked {count} times</p>
 9:        <button onClick={() => setCount(count + 1)}>10:         Click me
11:        </button>
12:      </div>
13:    );
14:  }- ์ฒซ ๋ฒ์งธ ์ค: 
useStateHook์ React์์ ๊ฐ์ ธ์ต๋๋ค. - ๋ค ๋ฒ์งธ ์ค: 
useStateHook์ ์ด์ฉํ๋ฉด state ๋ณ์์ ํด๋น state๋ฅผ ๊ฐฑ์ ํ ์ ์๋ ํจ์๊ฐ ๋ง๋ค์ด์ง๋๋ค. ๋ํ,useState์ ์ธ์์ ๊ฐ์ผ๋ก0์ ๋๊ฒจ์ฃผ๋ฉดcount๊ฐ์ 0์ผ๋ก ์ด๊ธฐํํ ์ ์์ต๋๋ค. - ์ํ ๋ฒ์งธ ์ค: ์ฌ์ฉ์๊ฐ ๋ฒํผ ํด๋ฆญ์ ํ๋ฉด 
setConutํจ์๋ฅผ ํธ์ถํ์ฌ state ๋ณ์๋ฅผ ๊ฐฑ์ ํฉ๋๋ค. React๋ ์๋ก์ดcount๋ณ์๋ฅผExample์ปดํฌ๋ํธ์ ๋๊ธฐ๋ฉฐ ํด๋น ์ปดํฌ๋ํธ๋ฅผ ๋ฆฌ๋ ๋๋งํฉ๋๋ค. 
๋ง์ ๊ฒ๋ค์ด ์๊ธฐ ๋๋ฌธ์ ์ฒ์์๋ ๋ค์ ์ด๋ ค์ธ ์ ์์ต๋๋ค. ์ค๋ช ์ด ์ดํด๊ฐ ์ ์ ๋๋ค๋ฉด, ์์ ์ฝ๋๋ฅผ ์ฒ์ฒํ ๋ค์ ์ฝ์ด๋ณด์ธ์. ํด๋์ค ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ๋ state ๋์ ๋ฐฉ์์ ์๊ณ , ์๋ก์ด ๋์ผ๋ก ์์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ๋ถ๋ช ํ ์ดํด๊ฐ ๊ฐ ๊ฒ์ ๋๋ค.
ํ: ๋๊ดํธ๊ฐ ์๋ฏธํ๋ ๊ฒ์ ๋ฌด์์ผ๊น์?
๋๊ดํธ๋ฅผ ์ด์ฉํ์ฌ state ๋ณ์๋ฅผ ์ ์ธํ๋ ๊ฒ์ ๋ณด์ จ์ ๊ฒ๋๋ค.
  const [count, setCount] = useState(0);๋๊ดํธ ์ผ์ชฝ์ state ๋ณ์๋ ์ฌ์ฉํ๊ณ ์ถ์ ์ด๋ฆ์ผ๋ก ์ ์ธํ ์ ์์ต๋๋ค.
  const [fruit, setFruit] = useState('banana');์ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฌธ๋ฒ์ โ๋ฐฐ์ด ๊ตฌ์กฐ ๋ถํดโ๋ผ๊ณ  ํ๊ณ , fruit๊ณผ setFruit, ์ด 2๊ฐ์ ๊ฐ์ ๋ง๋ค๊ณ  ์์ต๋๋ค. ์ฆ, useState๋ฅผ ์ฌ์ฉํ๋ฉด fruit์ด๋ผ๋ ์ฒซ ๋ฒ์งธ ๊ฐ๊ณผ setFruit๋ผ๋ ๋ ๋ฒ์งธ ๊ฐ์ ๋ฐํํฉ๋๋ค. ์๋์ ์ฝ๋์ ๊ฐ์ ํจ๊ณผ๋ฅผ ๋ผ ์ ์์ต๋๋ค.
  var fruitStateVariable = useState('banana'); // ๋ ๊ฐ์ ์์ดํ
์ด ์๋ ์์ ๋ฐํ
  var fruit = fruitStateVariable[0]; // ์ฒซ ๋ฒ์งธ ์์ดํ
  var setFruit = fruitStateVariable[1]; // ๋ ๋ฒ์งธ ์์ดํ
useState๋ฅผ ์ด์ฉํ์ฌ ๋ณ์๋ฅผ ์ ์ธํ๋ฉด 2๊ฐ์ ์์ดํ
 ์์ด ๋ค์ด์๋ ๋ฐฐ์ด๋ก ๋ง๋ค์ด์ง๋๋ค. ์ฒซ ๋ฒ์งธ ์์ดํ
์ ํ์ฌ ๋ณ์๋ฅผ ์๋ฏธํ๊ณ , ๋ ๋ฒ์งธ ์์ดํ
์ ํด๋น ๋ณ์๋ฅผ ๊ฐฑ์ ํด์ฃผ๋ ํจ์์
๋๋ค. ๋ฐฐ์ด ๊ตฌ์กฐ ๋ถํด๋ผ๋ ํน๋ณํ ๋ฐฉ๋ฒ์ผ๋ก ๋ณ์๋ฅผ ์ ์ธํด์ฃผ์๊ธฐ ๋๋ฌธ์ [0]์ด๋ [1]๋ก ๋ฐฐ์ด์ ์ ๊ทผํ๋ ๊ฒ์ ์ข์ง ์์ ์ ์์ต๋๋ค.
์ฃผ์
this๋ฅผ React์ ์๋ฆฌ์ง ์์๋๋ฐ, ์ด๋ป๊ฒ React๊ฐ ํน์  ์ปดํฌ๋ํธ์์useState๋ฅผ ์ฌ์ฉํ ๊ฒ์ ์๋ ์ง ๊ถ๊ธํดํ ์ ์์ต๋๋ค. ์ด ์ง๋ฌธ๊ณผ ๋ค๋ฅธ ๊ถ๊ธ ์ฌํญ๋ค์ ๋์ค์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
ํ: ์ฌ๋ฌ ๊ฐ์ state ๋ณ์๋ฅผ ์ฌ์ฉํ๊ธฐ
[something, setSomething]์ ์์ฒ๋ผ state ๋ณ์๋ฅผ ์ ์ธํ๋ ๊ฒ์ ์ ์ฉํฉ๋๋ค. ์๋ํ๋ฉด ์ฌ๋ฌ ๊ฐ์ ๋ณ์๋ฅผ ์ ์ธํ  ๋ ๊ฐ๊ฐ ๋ค๋ฅธ ์ด๋ฆ์ ์ค ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
function ExampleWithManyStates() {
  // ์ฌ๋ฌ ๊ฐ์ state๋ฅผ ์ ์ธํ  ์ ์์ต๋๋ค!
  const [age, setAge] = useState(42);
  const [fruit, setFruit] = useState('banana');
  const [todos, setTodos] = useState([{ text: 'Learn Hooks' }]);์์ ์ฝ๋๋ age, fruit, todos๋ผ๋ ์ง์ญ ๋ณ์๋ฅผ ๊ฐ์ง๋ฉฐ ๊ฐ๋ณ์ ์ผ๋ก ๊ฐฑ์ ํ  ์ ์์ต๋๋ค.
  function handleOrangeClick() {
    // this.setState({ fruit: 'orange' })์ ๊ฐ์ ํจ๊ณผ๋ฅผ ๋
๋๋ค.
    setFruit('orange');
  }์ฌ๋ฌ ๊ฐ์ state ๋ณ์๋ฅผ ์ฌ์ฉํ์ง ์์๋ ๋ฉ๋๋ค. state ๋ณ์๋ ๊ฐ์ฒด์ ๋ฐฐ์ด์ ์ ๊ฐ์ง๊ณ  ์์ ์ ์์ผ๋ฏ๋ก ์๋ก ์ฐ๊ด์๋ ๋ฐ์ดํฐ๋ฅผ ๋ฌถ์ ์ ์์ต๋๋ค. ํ์ง๋ง ํด๋์ค ์ปดํฌ๋ํธ์ this.setState์ ๋ฌ๋ฆฌ state๋ฅผ ๊ฐฑ์ ํ๋ ๊ฒ์ ๋ณํฉํ๋ ๊ฒ์ด ์๋๋ผ ๋์ฒดํ๋ ๊ฒ์
๋๋ค.
๋ ๋ฆฝ์ ์ธ state ๋ณ์ ๋ถํ ์ ๋ํ ์ถ๊ฐ์ ์ธ ๊ถ์ฅ ์ฌํญ์ ์์ฃผ ๋ฌป๋ ์ง๋ฌธ์์ ๋ณผ ์ ์์ต๋๋ค. ์์ฃผ ๋ฌป๋ ์ง๋ฌธ.
๋ค์ ๋จ๊ณ
์ด๋ฒ ํ์ด์ง์์ React์ Hook ์ค ํ๋์ธ useState์ ๋ํด ๋ฐฐ์ ์ต๋๋ค. useState๋ฅผ ์ด์ฉํ๋ฉด ํจ์ ์ปดํฌ๋ํธ ์์์ state๋ฅผ ์ฌ์ฉํ  ์ ์์ต๋๋ค.
Hook์ ํจ์ ์ปดํฌ๋ํธ์์ React์ ํน์ง์ ๊ฐ๊ฒ ํด์ฃผ๋ ํจ์์
๋๋ค. Hook์ ํญ์ use๋ผ๋ ํค์๋๋ก ์์ํ๋ฉฐ useState ์ด์ธ์ ์์ง ๋ณด์ง ๋ชปํ ๋ง์ Hook๋ค์ด ์์ต๋๋ค.
๋ค์ ๊ฐ์ข๋ฅผ ์ด์ด์ ํฉ์๋ค. ๋ค์ Hook ๊ฐ์ข: useEffect. ๋ค์์ ๋ฐฐ์ธ Hook์ ํด๋์ค ์ปดํฌ๋ํธ์ ์๋ช
์ฃผ๊ธฐ์ ๋น์ทํ ํผํฌ๋จผ์ค๋ฅผ ๋ผ ์ ์์ต๋๋ค.