Post

๐ŸŽฌ ReactJS๋กœ ์˜ํ™” ์›น ์„œ๋น„์Šค ๋งŒ๋“ค๊ธฐ (03) - React์˜ State (1)

useState

React JS์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅ์‹œ์ผœ ์ž๋™์œผ๋กœ ๋ฆฌ๋ Œ๋”๋ง์„ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์— ์ด์šฉ๋œ๋‹ค

image

์ด๋ ‡๊ฒŒ const data = React.useState();๋ฅผ console.log ์ฐ์–ด๋ณด๋ฉด image

undefined์™€ ํ•จ์ˆ˜๊ฐ€ ์ ํžŒ ๋ฐฐ์—ด์ด ์ฐํžˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค
undefined๋Š” data์ด๊ณ , f๋Š” data๋ฅผ ๋ฐ”๊ฟ€ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค
React.useState() ํ•จ์ˆ˜๋Š” ์ดˆ๊ธฐ๊ฐ’์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Œ
์ฆ‰, undefined๋Š” ์ดˆ๊ธฐ๊ฐ’! ย ย  React.useState(0); ์„ ํ•œ๋‹ค๋ฉด ์ฝ˜์†”์—๋Š” [0, ฦ’] ๊ฐ€ ์ฐํž ๊ฒƒ์ด๋‹ค
๊ทธ๋ฆฌ๊ณ  ๋‘ ๋ฒˆ์งธ ์š”์†Œ์ธ f๋Š” ๊ทธ ๊ฐ’์„ ๋ฐ”๊พธ๋Š” ํ•จ์ˆ˜!

์ •๋ฆฌํ•˜์ž๋ฉด,
React์˜ useState๋Š” ์šฐ๋ฆฌํ•œํ…Œ ๋ฐฐ์—ด ํ•˜๋‚˜๋ฅผ ์ฃผ๋Š”๋ฐ ๊ทธ ๋ฐฐ์—ด์˜ ์ฒซ๋ฒˆ์จฐ ์š”์†Œ๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋‹ด์œผ๋ ค๋Š” data๊ฐ’์ด๊ณ ,
๋‘๋ฒˆ์งธ ์š”์†Œ๋Š” ๊ทธ data๊ฐ’์„ ๋ฐ”๊ฟ€๋•Œ ์‚ฌ์šฉํ•  ํ•จ์ˆ˜์ด๋‹ค

๊ทธ๋ฆฌ๊ณ  const data = React.useState(0); ๋Œ€์‹  const [counter, setCounter] = React.useState(0); ์„ ์ค€๋‹ค๋ฉด counter์™€ setCounter์— ๊ฐ๊ฐ 0 ๊ณผ ฦ’ ๊ฐ€ ํ• ๋‹น๋˜๊ฒŒ ๋œ๋‹ค!

๋ฐฉ๊ธˆ ๋งํ•œ ๊ฒƒ ์ฒ˜๋Ÿผ ๋ณดํ†ต data์—๋Š” counter์ฒ˜๋Ÿผ ์›ํ•˜๋Š”๋Œ€๋กœ ๋ถ™์ด๊ณ 
ฦ’๋Š” set ๋’ค์— ๋ฐ์ดํ„ฐ ์ด๋ฆ„์„ ๋ถ™์—ฌ setCounter๋กœ ์‚ฌ์šฉํ•œ๋‹ค
์–ด๋–ค๊ฐ’์„ ๋ถ€์—ฌํ•˜๋“  setCounter ํ•จ์ˆ˜๋Š” ๊ทธ ๊ฐ’์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ๋ฆฌ๋ Œ๋”๋ง ์ผ์œผํ‚จ๋‹ค!

Vanilla JS ๐Ÿ†š React JS

๊ทธ๋Ÿผ ์ด์ œ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•œ ๋งŒํผ count๊ฐ€ ์ฆ๊ฐ€๋˜๋Š” ๊ฐ„๋‹จํ•œ ํ”„๋กœ์ ํŠธ๋กœ VanillaJS์™€ ReactJS๋ฅผ ๋น„๊ตํ•ด๋ณด์ž!

Total clicks: 0


  • Vanilla JS ver.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!DOCTYPE html>
<html lang="en">
  <body>
    <h3 id="click">Total clicks: 0</h3>
    <button id="btn">Click me</button>
  </body>
  <script>
    let counter = 0;
    const button = document.getElementById("btn");
    const h3 = document.getElementById("click");
    function handleClick() {
      counter = counter + 1;
      h3.innerText = `Total clicks: ${counter}`;
    }
    button.addEventListener("click", handleClick);
  </script>
</html>

์ œ๋ชฉ ์—†๋Š” ๋™์˜์ƒ - Clipchamp๋กœ ์ œ์ž‘ (1)

Vanilla JS์—์„œ๋Š” h3 ์ „์ฒด๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.


  • React JS ver.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<!DOCTYPE html>
<html lang="en">
  <body>
    <div id="root"></div>
  </body>
  <script src="https://unpkg.com/react@17.0.2/umd/react.production.min.js"></script>
  <script src="https://unpkg.com/react-dom@17.0.2/umd/react-dom.production.min.js"></script>
  <script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
  <script type="text/babel">
    const root = document.getElementById("root");
    function App() {
      const [counter, setCounter] = React.useState(0);
      const onClick = () => {
        setCounter(counter + 1);
      };
      return (
        <div>
          <h3>Total clicks: {counter}</h3>
          <button onClick={onClick}>Click me</button>
        </div>
      );
    }
    ReactDOM.render(<App />, root);
  </script>
</html>

์ œ๋ชฉ ์—†๋Š” ๋™์˜์ƒ - Clipchamp๋กœ ์ œ์ž‘ (6)

React์—์„œ๋Š” ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„๋งŒ ๋ฆฌ๋ Œ๋”๋ง๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค !
์ฆ‰, React์—์„œ๋Š” state๊ฐ€ ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค ์ปดํฌ๋„ŒํŠธ ์ „์ฒด๊ฐ€ rerendering์ด ์ผ์–ด๋‚˜๋Š”๋ฐ,
eventlistener๊ฐ€ ๋“ฑ๋ก๋˜๊ฑฐ๋‚˜ Total clicks์„ ๋‹ค์‹œ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์‹ค์ œ๋กœ ๋ฐ”๋€Œ๋Š” ๊ฐ’์ธ {counter} ์ด ๋ถ€๋ถ„๋งŒ ์—…๋ฐ์ดํŠธ๋œ๋‹ค

React๋Š” state๊ฐ’์ด ๋ฐ”๋€Œ๋ฉด ์ƒˆ๋กœ์šด ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋œ๋‹ค !!

โœ… ์ด๊ฒŒ ์™œ ์ข‹์€๊ฑด๊ฐ€?

  • Vanilla JS์—์„œ๋Š” DOM ๋ณ€๊ฒฝ์„ ์ง์ ‘ ์ฒ˜๋ฆฌํ•œ๋‹ค. ์ฆ‰, ํ•„์š”ํ•œ DOM ์š”์†Œ๋ฅผ ์ง์ ‘ ์„ ํƒํ•˜๊ณ , ์š”์†Œ์˜ ์†์„ฑ์„ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๊ธฐ์กด ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…์„ ์ง์ ‘ ์ˆ˜ํ–‰ํ•œ๋‹ค.
    DOM ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•˜๋ฉด, ๋ธŒ๋ผ์šฐ์ €๋Š” ๋ณ€๊ฒฝ๋œ DOM ํŠธ๋ฆฌ๋ฅผ ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜๊ณ , ๋ Œ๋” ํŠธ๋ฆฌ๋ฅผ ๋‹ค์‹œ ์ƒ์„ฑํ•œ ํ›„ ํ™”๋ฉด์— ๊ทธ๋ฆฝ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์€ ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” ์—ฐ์‚ฐ์œผ๋กœ, ์ž์ฃผ ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋ฉด ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ทธ๋ ‡์ง€๋งŒ React JS๋Š” DOM ๋ณ€๊ฒฝ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ€์ƒ DOM(Virtual DOM)์ด๋ผ๋Š” ๊ฐœ๋…์„ ๋„์ž…!
    ์ƒํƒœ ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๊ฐ€์ƒ DOM ํŠธ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์ด์ „์˜ ๊ฐ€์ƒ DOM ํŠธ๋ฆฌ์™€ ๋น„๊ตํ•˜์—ฌ ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„์„ ํŒŒ์•…ํ•œ๋‹ค
    ์ด๋ ‡๊ฒŒ ํŒŒ์•…๋œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ๋งŒ ์‹ค์ œ DOM์— ๋ฐ˜์˜ํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ์ด ๊ณผ์ •์„ โ€˜์žฌ์กฐ์ •(Reconciliation)โ€™ ๋˜๋Š” โ€˜Diffingโ€™์ด๋ผ๊ณ  ํ•จ
    ๊ฐ€์ƒ DOM์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ, ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ ์š”์†Œ๋งŒ ์‹ค์ œ DOM์— ๋ฐ˜์˜๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆํ•„์š”ํ•œ ์—ฐ์‚ฐ์„ ์ค„์ด๊ณ  ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค

๋”ฐ๋ผ์„œ, ReactJS๋Š” ๋ณต์žกํ•œ UI ์—…๋ฐ์ดํŠธ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ์›น์˜ ์‘๋‹ต์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ณ  ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค!

This post is licensed under CC BY 4.0 by the author.