React๋ž€?

1. ๊ฐœ์š”

์›น ๊ฐœ๋ฐœ์— ์‚ฌ์šฉํ•˜๋Š” ๋Œ€ํ‘œ์ ์ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ UI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ/ํ”„๋ ˆ์ž„์›Œํฌ์—๋Š” ์–ด๋–ค ๊ฒƒ์ด ์žˆ์„๊นŒ? ๋‚ด๊ฐ€ ๊ณต๋ถ€ํ•˜๊ณ  ์žˆ๋Š” React๊ฐ€ ๋ฐ”๋กœ ๋Œ€ํ‘œ์ ์ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ UI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค. ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š” ๊ฒƒ๋“ค ์ค‘ Angular์™€ Vue๊ฐ€ ์žˆ๋‹ค.

๊ทธ ์ค‘ React์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ•˜๊ณ  ์•„๋ž˜์— ์ •๋ฆฌํ•˜๊ณ ์ž ํ•œ๋‹ค.

JSX๊ณผ ๊ฐ€์ƒ ๋”(Virtual DOM)์€ ๋‹ค๋ฅธ ์ฑ•ํ„ฐ์—์„œ ์ž์„ธํ•˜๊ฒŒ ๋‹ค๋ฃฌ๋‹ค.


2. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ UI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ/ํ”„๋ ˆ์ž„์›Œํฌ

ํ”„๋ ˆ์ž„์›Œํฌ์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

ํ”„๋ ˆ์ž„์›Œํฌ์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ฐ€์žฅ ํฐ ์ฐจ์ด์ ์€ ํ”„๋กœ๊ทธ๋žจ์˜ ํ๋ฆ„์— ๋Œ€ํ•œ ์ œ์–ด ๊ถŒํ•œ์ด๋‹ค. ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ํ๋ฆ„์˜ ์ œ์–ด ๊ถŒํ•œ์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹Œ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๊ฐ–๊ณ  ์žˆ๋Š” ๋ฐ˜๋ฉด์—, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ํ๋ฆ„์— ๋Œ€ํ•œ ์ œ์–ด๋ฅผ ํ•˜์ง€ ์•Š๊ณ  ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ํ•„์š”ํ•  ๋•Œ ๊ฐ€์ ธ๋‹ค ์‚ฌ์šฉํ•˜๋Š” ํ˜•ํƒœ์ด๋‹ค.

User Interface (UI, ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค)

์‚ฌ์šฉ์ž์™€ ์ปดํ“จํ„ฐ ํ”„๋กœ๊ทธ๋žจ์ด ์„œ๋กœ ์ƒํ˜ธ์ž‘์šฉ์„ ํ•˜๊ธฐ ์œ„ํ•ด ์ค‘๊ฐ„์—์„œ ์„œ๋กœ ๊ฐ„์— ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์„ ์ œ์–ดํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค. ์›น ์‚ฌ์ดํŠธ์—์„œ ๋ฒ„ํŠผ๊ณผ ์ž…๋ ฅ์ฐฝ ๋“ฑ์ด ๋ชจ๋‘ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค. ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๊ธฐ๋Šฅ ๋ชจ์Œ์ง‘(๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)์„ UI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.


2-1. ReactJS

React

๋ฆฌ์•กํŠธ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํ•˜๋‚˜๋กœ์„œ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค. ๋ฉ”ํƒ€(๊ตฌ ํŽ˜์ด์Šค๋ถ)์—์„œ ๋งŒ๋“ค์—ˆ์œผ๋ฉฐ 2013๋…„์— ์ฒ˜์Œ์œผ๋กœ ์ถœ์‹œ๋˜์–ด ์‚ฌ์šฉ๋ฅ ์ด ์ ์  ์ฆ๊ฐ€ํ•˜๋‹ค๊ฐ€ ํ˜„์žฌ๋Š” ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ชจ๋‘ ๋”ฐ๋Œ๋ฆฌ๊ณ  ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ UI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋˜์—ˆ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— HTML์„ ํฌํ•จํ•˜๋Š” JSX(JavaScript XML)์ด๋ผ๋Š” ๊ฐ„๋‹จํ•œ ๋ฌธ๋ฒ•๊ณผ ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ(One-way Data Binding)์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ€์ƒ ๋”(Virtual DOM)์ด๋ผ๋Š” ๊ฐœ๋…์„ ์‚ฌ์šฉํ•˜์—ฌ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํผํฌ๋จผ์Šค๋ฅผ ์ตœ์ ํ™”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.


2-2. AngularJS

Angular

์•ต๊ทค๋Ÿฌ(Angular)๋Š” ํด๋ผ์ด์–ธํŠธ ๋‹จ์ผ ํŽ˜์ด์ง€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(SPA)์„ ๊ฐœ๋ฐœ์„ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ์˜คํ”ˆ์†Œ์Šค ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค. ์ตœ๊ทผ์˜ ํ”„๋ก ํŠธ์—”๋“œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(๋˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ) React, Vue์™€ ํ•จ๊ป˜ ์ž์ฃผ ์–ธ๊ธ‰๋œ๋‹ค. ๋™์  ์ฝ˜ํ…์ธ  ์ž‘์„ฑ์„ ํ•˜๋Š” ๋ฐ ์žˆ์–ด์„œ ํš๊ธฐ์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์œผ๋กœ ์œ ํ–‰์„ ๋ถˆ๋Ÿฌ์ผ์œผํ‚ฌ ๋งŒํผ ๋งŽ์€ ์ˆ˜์š”๊ฐ€ ์žˆ์—ˆ๋‹ค.

2010๋…„ ์ค‘๋ฐ˜ ๋•Œ ๊นŒ์ง€๋งŒ ํ•ด๋„ ๊ต‰์žฅํžˆ ๋งŽ์€ ๊ณณ์—์„œ ์‚ฌ์šฉ๋˜์—ˆ์ง€๋งŒ 2018๋…„ LTS(๋‹จ๊ธฐ๊ฐ„์— ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•˜์ง€ ์•Š๊ณ  ์•ˆ์ •์ ์ธ ๋ฒ„์ „์„ ์žฅ๊ธฐ๊ฐ„ ์œ ์ง€ํ•˜๋Š” ๋ฐฉ์‹)๋ชจ๋“œ์— ๋Œ์ž…ํ•˜์˜€๊ณ  2022๋…„ 1์›” LTS ๋งˆ์ € ์ค‘๋‹จ์„ ์„ ์–ธํ•˜๊ณ  ์‚ฌ์‹ค์ƒ ๊ณต์‹์ ์ธ ์ง€์›์ด ์ข…๋ฃŒ ๋˜์—ˆ๋‹ค.


2-3. VueJS

Vue

๋ทฐ๋Š” ํฐ IT๊ธฐ์—…์˜ ์ฃผ๋„๋กœ ์‹œ์ž‘๋œ ์•ต๊ทค๋Ÿฌ(๊ตฌ๊ธ€), ๋ฆฌ์•กํŠธ(๋ฉ”ํƒ€)์™€๋Š” ๋‹ค๋ฅด๊ฒŒ Evan You๋ผ๋Š” ์ค‘๊ตญ์ธ ๊ฐœ๋ฐœ์ž ํ•œ ๋ช…์ด ์‹œ์ž‘ํ•œ ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ์ด๋‹ค. 2014๋…„์— ์ฒ˜์Œ ์ถœ์‹œ๋˜์—ˆ๊ณ  ์ดํ›„ ์ ์  ์˜ํ–ฅ๋ ฅ์ด ์ปค์ ธ ํ˜„์žฌ๋Š” ๋ฆฌ์•กํŠธ์™€ ํ•ญ์ƒ ํ•จ๊ป˜ ์–ธ๊ธ‰๋˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋Œ€ํ‘œ ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค.


3. React์˜ ํŠน์ง•


3-1. ์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ

๋ฆฌ์•กํŠธ๋กœ ์ž‘์—…ํ•  ๋•Œ ์–ด๋–ค ๋กœ์ง์œผ๋กœ ์–ด๋–ป๊ฒŒ ์ฝ”๋“œ๋ฅผ ์งœ์•ผ ํŽ˜์ด์ง€๋ฅผ ๊ทธ๋ ค์งˆ ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ธฐ ๋ณด๋‹ค๋Š” ์ปดํฌ๋„ŒํŠธ๋‚˜ ๋ฐ์ดํ„ฐ ๋“ฑ์˜ ๋ฐฐ์น˜๋ฅผ ํ†ตํ•ด ๋ฌด์—‡์ด ๋ Œ๋”๋ง ๋ ์ง€์— ๋Œ€ํ•ด ์ƒ๊ฐ์„ ํ•œ๋‹ค. ์ด๊ฒƒ์ด ์„ ์–ธํ˜• UI์˜ ํ•ต์‹ฌ์ด๋‹ค.

๋จผ์ € ์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ฐจ์ด์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.

  1. ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ

    • ์–ด๋–ค ๋ฐฉ๋ฒ•(How)์œผ๋กœ ํ•  ๊ฒƒ์ธ์ง€๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธ

    • ๋ฌด์—‡์„ ํ•˜์ง€ ์„ธ์„ธํ•˜๊ฒŒ ์ง€์ •ํ•œ๋‹ค.

    function double(arr) {
      let result = [];
      for (let i = 0; i < arr.length; i++) {
        result.push(arr[i] * 2);
      }
      return result;
    }
  2. ์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ

    • ๋ฌด์—‡์ธ๊ฐ€(What)๋ฅผ ์ž‘์—…ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์„ ์ •์˜ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธ

    • ๊ฒฐ๊ณผ๋งŒ ๊ธฐ์ˆ ํ•  ๋ฟ ์–ด๋–ป๊ฒŒ๋Š” ๊ธฐ์ˆ ํ•˜์ง€ ์•Š๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ๋ฒ•

    • ์˜๋„์— ์ง‘์ค‘ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ๋ฒ•

    function double(arr) {
      return arr.map((x) => x * 2);
    }
    • ์šฐ๋ฆฌ๋Š” filter, map, reduce ๋ฉ”์„œ๋“œ๊ฐ€ ์–ด๋–ค ๋กœ์ง์œผ๋กœ ๊ตฌํ˜„๋˜๋Š”์ง€ ์•Œ ํ•„์š”๊ฐ€ ์—†๋‹ค. ํ•ด๋‹น ๋ฉ”์„œ๋“œ์˜ ๊ตฌ์ฒด์ ์ธ ์ ˆ์ฐจ๋Š” ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š๊ณ , ์ถ”์ƒํ™”๋œ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์„ ์–ธ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.

    • ๊ฐ€๋…์„ฑ์ด ์ข‹์œผ๋ฉฐ ์˜ˆ์ธก์ด ์‰ฌ์›€

๊ทธ๋ ‡๋‹ค๋ฉด ๋ฆฌ์•กํŠธ์—์„œ์˜ ์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ?

๋ฆฌ์•กํŠธ์˜ JSX๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋น„์„ ์–ธํ˜•์ ์ธ ๋ถ€๋ถ„์„ ์บก์Аํ™”ํ•ด์„œ ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์œผ๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค.

์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด <ul>ํƒœ๊ทธ ์•ˆ์— ์ƒˆ๋กœ์šด <li>ํƒœ๊ทธ๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ด์šฉํ•ด์„œ ์ƒ์„ฑํ•˜๊ณ  ์žˆ๋‹ค.

<ul id="list"></ul>
<script>
  var arr = [1, 2, 3, 4, 5];
  var elem = document.querySelector("#list");

  for (var i = 0; i < arr.length; i++) {
    var child = document.createElement("li");
    clild.innerHTML = arr[i];
    elem.appendChild(child);
  }
</script>

์ด๋Ÿฌํ•œ ์ฝ”๋“œ๋ฅผ ๋ฆฌ์•กํŠธ์—์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด JSX๋ฅผ ํ†ตํ•ด ์œ ์‚ฌ HTML ์ฝ”๋“œ์•ˆ์—์„œ map ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ์„ ์–ธ์ ์œผ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

const arr = [1, 2, 3, 4, 5];
return (
  <ul>
    {arr.map((elem) => (
      <li>{elem}</li>
    ))}
  </ul>
);

๋ฆฌ์•กํŠธ๊ฐ€ ์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ธ ์ด์œ 

๋ฆฌ์•กํŠธ์˜ JSX ์ž์ฒด๊ฐ€ ์„ ์–ธํ˜•์€ ์•„๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ JSX์˜ ์บก์Аํ™”๋ฅผ ํ†ตํ•ด ์„ ์–ธํ˜• ์ฝ”๋“œ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ฆฌ์•กํŠธ๋กœ ๊ฐœ๋ฐœ์„ ํ•˜๋ฉด ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  ํ•„์š”ํ•œ ๊ณณ์— ์“ฐ๊ฒŒ ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ๋ณด์ž.

const Profile = () => {
  return (
    <div>
      <Header />
      ...
      <Footer />
    </div>
  );
};

<Header/>, <Footer/>์€ JSX๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ์บก์Аํ™”ํ•œ ์ปดํฌ๋„ŒํŠธ๋‹ค. ๊ฐœ๋ฐœ์ž๋“ค์€ <Header>์ปดํฌ๋„ŒํŠธ์™€ <Footer/>์ปดํฌ๋„ŒํŠธ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด๋ถ€ ๋กœ์ง์€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ๊ฐ๊ฐ ํ—ค๋”์™€ ํ‘ธํ„ฐ์™€ ๊ด€๋ จํ•œ ์ปดํฌ๋„ŒํŠธ์ด๊ณ  Profile์€ ์ด ๋‘๊ฐœ์˜ ์ปดํฌ๋„ŒํŠธ์™€ ๊ธฐํƒ€ ๋“ฑ๋“ฑ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ํŽ˜์ด์ง€๊ตฌ๋‚˜๋ผ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๊ณ  ์–ด๋–ป๊ฒŒ ๊ทธ๋ ค์งˆ์ง€๋„ ์ง์ž‘ ์˜ˆ์ธกํ•  ์ˆ˜ ์žˆ๋‹ค.


3-2. ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ (One way data binding)

๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์ด๋ž€? ๋‘ ๋ฐ์ดํ„ฐ ํ˜น์€ ์ •๋ณด์˜ ์†Œ์Šค๋ฅผ ๋ชจ๋‘ ์ผ์น˜์‹œํ‚ค๋Š” ๊ธฐ๋ฒ•์ด๋‹ค. ์ฆ‰ ํ™”๋ฉด์— ๋ณด์ด๋Š” ๋ฐ์ดํ„ฐ์™€ ๋ธŒ๋ผ์šฐ์ € ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ผ์น˜์‹œํ‚ค๋Š” ๊ธฐ๋ฒ•์ด๋‹ค.

  • ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ

    1 way data binding

    • ํ•œ์ชฝ ๋ฐฉํ–ฅ์œผ๋กœ๋งŒ ์ œ์–ด๊ฐ€ ๊ฐ€๋Šฅํ•œ ๊ฒƒ

    • js์—์„œ๋Š” ์‚ฌ์šฉ์ž์˜ ํ™”๋ฉด์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์‚ฌ์šฉ์ž๋Š” js์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋™์ ์œผ๋กœ ๋ณ€๊ฒฝ์‹œํ‚ค์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€ํ™”๋œ ๊ฐ’์„ ๊ฐ‘์ง€ํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์„ ์‹œ์ผœ์ค˜์•ผ ํ•จ

    • JS -> HTML ๋งŒ ๊ฐ€๋Šฅ

    • ๋ฐ์ดํ„ฐ ๋ณ€ํ™”์— ๋”ฐ๋ฅธ ์„ฑ๋Šฅ ์ €ํ•˜ ์—†์ด DOM ๊ฐ์ฒด ๊ฐฑ์‹  ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ํ™”๋ฉด์„ ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋งค๋ฒˆ ์ž‘์„ฑํ•ด์•ผ ํ•จ

    const [value, setValue] = useState("");
    
    return <input value={value} onChange={(e) => setValue(e.target.value)} />;
    • ์œ„์˜ ์ฝ”๋“œ๋Š” ๋ฆฌ์•กํŠธ์—์„œ input๊ฐ’์„ ๋ณ€ํ™”์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์ž‘์„ฑํ•˜๋Š” ์ฝ”๋“œ์ด๋‹ค. inputํƒœ๊ทธ์˜ value์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ’์œผ๋กœ state์˜ ์ดˆ๊ธฐ๊ฐ’์ด ""์ด ํ• ๋‹น์ด ๋œ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ input์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๊ฒŒ ๋  ๋•Œ onChangeํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜์–ด state๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋กœ์จ ์‚ฌ์šฉ์ž๋Š” ๋ณ€๊ฒฝ๋œ input๊ฐ’์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ onChangeํ•จ์ˆ˜๊ฐ€ ์—†๋‹ค๋ฉด ์‚ฌ์šฉ์ž๋Š” ๋ณ€๊ฒฝ๋œ input๊ฐ’์„ ๋ณผ ์ˆ˜ ์—†๋‹ค. ์ฆ‰, ์‚ฌ์šฉ์ž๊ฐ€ ๋ณ€์ˆ˜๋ฅผ ์ง์ ‘์ ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ž‘์„ฑ๋œ JS ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•˜์—ฌ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋ฐ”๊พผ๋‹ค.

    • ๋‚˜๋Š” ๋ฆฌ์•กํŠธ์—์„œ Formํƒœ๊ทธ์™€ inputํƒœ๊ทธ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ์œ„์˜ ๋ฐฉ๋ฒ•์œผ๋กœ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ  useForm์ด๋ผ๋Š” ์•„์ฃผ ์ข‹์€ ํŒจ์ง€์ง€ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•œ๋‹ค.


  • ์–‘๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ

    2 ways data binding

    • MVC ํŒจํ„ด์—์„œ ๋ทฐ์™€ ๋ชจ๋ธ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋™๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ

    • ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ๊ฐ’์— ๋”ฐ๋ผ js์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๊ณ , js์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์‚ฌ์šฉ์ž์˜ ํ™”๋ฉด๋„ ๋ณ€๊ฒฝ

    • HTML -> JS, JS -> HTML ์–‘์ชฝ ๋ชจ๋‘ ๊ฐ€๋Šฅ

    • ์ž…๋ ฅ๋œ ๊ฐ’์ด๋‚˜ ๋ณ€๊ฒฝ๋œ ๊ฐ’์— ๋”ฐ๋ผ ๋‚ด์šฉ์ด ๋ฐ”๋กœ ๋ฐ”๋€Œ๊ธฐ ๋•Œ๋ฌธ์— ๋”ฐ๋กœ ์ฒดํฌํ•ด์ฃผ์ง€ ์•Š์Œ

    • ์ˆ˜๋งŽ์€ ์ฝ”๋“œ์˜ ์–‘์„ ์ค„์—ฌ์ฃผ๊ณ  ์œ ์ง€๋ณด์ˆ˜๋‚˜ ์ฝ”๋“œ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ๋งค์šฐ ์‰ฝ๊ฒŒ ํ•ด์คŒ

    • vue.js์˜ ์˜ˆ์‹œ

      • V-model๊ณผ V-on์„ ํ†ตํ•ด ์–‘๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์„ ํ•œ๋‹ค.

      • V-model์ด DOM ์—ฐ๊ด€๋œ ๋‚ด์šฉ์„ ์žก์•„๋‚ด๊ณ , vue๊ฐ€ ๋ฐ”๋ผ๋ณด๋Š” ๋Œ€์ƒ์˜ ์†์„ฑ๊ณผ ์—ฐ๊ฒฐ๋œ๋‹ค.

      • V-on์€ ์ด๋ฒคํŠธ๋ฅผ ์žก์•„๋‚ด๋Š” ๋ฐ ์‚ฌ์šฉํ•œ๋‹ค.


3-3. ๊ฐ€์ƒ ๋” (Virtual DOM)

๊ฐ€์ƒ ๋” (Virtual DOM)์€ ์•„๋ž˜์˜ ํŒŒํŠธ์—์„œ ์ข€๋” ์ž์„ธํžˆ ๋‹ค๋ฃฌ๋‹ค. ๊ฐ€์ƒ ๋‘ (Virtual DOM)๋ฐ”๋กœ๊ฐ€๊ธฐ


3-4. JSX

JSX์€ ์•„๋ž˜์˜ ํŒŒํŠธ์—์„œ ์ข€๋” ์ž์„ธํžˆ ๋‹ค๋ฃฌ๋‹ค. JSX๋ฐ”๋กœ๊ฐ€๊ธฐ


4. React์˜ ์žฅ๋‹จ์ 


4-1. React์˜ ์žฅ์ 

  1. ๋น ๋ฅธ ์—…๋ฐ์ดํŠธ์™€ ๋ Œ๋”๋ง ์†๋„

    • Virtual DOM๋ฅผ ํ†ตํ•ด ๋น ๋ฅธ ์—…๋ฐ์ดํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

    • ๋ฆฌ์•กํŠธ๋Š” DOM๋ฅผ ์ง์ ‘ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•  ์ตœ์†Œํ•œ์˜ ๋ถ€๋ถ„๋งŒ์„ ์ฐพ์•„์„œ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.

  2. ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ

    • ๋ฆฌ์•กํŠธ๋กœ ๊ฐœ๋ฐœ๋œ ์›น์‚ฌ์ดํŠธ๋Š” ์ˆ˜๋งŽ์€ ์ปดํฌ๋„ŒํŠธ์˜ ์กฐํ•ฉ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์–ด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์žฅ์ ์„ ๊ทธ๋Œ€๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

  3. ์žฌ์‚ฌ์šฉ์„ฑ

    • ์žฌ์‚ฌ์šฉ์„ฑ์ด๋ผ๋Š” ๊ฒƒ์€ ๋‹ค์‹œ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•œ ์„ฑ์งˆ์„ ์˜๋ฏธํ•œ๋‹ค.

    • ์žฌ์‚ฌ์šฉ์„ฑ์œผ๋กœ ์ธํ•ด ์ „์ฒด ์†Œํ”„ํŠธ์›จ์–ด์˜ ๊ฐœ๋ฐœ ๊ธฐ๊ฐ„์ด ๋‹จ์ถ•๋œ๋‹ค.

    • ์žฌ์‚ฌ์šฉ์„ฑ์œผ๋กœ ์ธํ•ด ์œ ์ง€ ๋ณด์ˆ˜๊ฐ€ ์šฉ์ดํ•˜๋‹ค.

    • ์žฌ์‚ฌ์šฉ์„ฑ์ด ๋†’๋‹ค๋Š” ๊ฒƒ์€ ์—ฌ๋Ÿฌ ๋ชจ๋“ˆ ๊ฐ„์˜ ์˜์กด์„ฑ์ด ๋‚ฎ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ ๋ถ€๋ถ„๋“ค์ด ์ž˜ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ๊ณ  ์‰ฝ๊ฒŒ ๋ฒ„๊ทธ๋ฅผ ์ฐพ์•„์„œ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

  4. ํ™œ๋ฐœํ•œ ์ง€์‹ ๊ณต์œ  & ์ปค๋ฎค๋‹ˆํ‹ฐ

    • ๋ฆฌ์•กํŠธ์˜ ๊ฒฝ์šฐ github Star๊ฐ€ ๋ชจ๋“  ์˜คํ”ˆ์†Œ์Šค๋ฅผ ํ†ตํ‹€์–ด ์ตœ์ƒ์œ„๊ธ‰ ์ˆ˜์น˜๋ฅผ ๋ณด์ด๊ณ  ์žˆ๋‹ค.

    • ์Šคํƒ์˜ค๋ฒ„ํ”Œ๋กœ ์›น์‚ฌ์ดํŠธ์—์„œ๋Š” ๋ฆฌ์•กํŠธ ๊ด€๋ จ ์งˆ๋ฌธ์ด 35๋งŒ๊ฐœ ์ด์ƒ ๋“ฑ๋ก๋˜์–ด ์žˆ๋‹ค.

  5. ๋ชจ๋ฐ”์ผ ์•ฑ ๊ฐœ๋ฐœ ๊ฐ€๋Šฅ

    • ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ๋ผ๋Š” ๋ชจ๋ฐ”์ผ ํ™˜๊ฒฝ UI ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋ฐ”์ผ ์•ฑ๋„ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค.


4-2. React์˜ ๋‹จ์ 

  1. ๋ฐฉ๋Œ€ํ•œ ํ•™์Šต๋Ÿ‰

    • ์ƒˆ๋กœ์šด ๋ฒ„์ „์œผ๋กœ ์—…๋ฐ์ดํŠธ๋˜๋ฉด ์ด์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ํ•™์Šตํ•˜๊ณ  ์ˆ™์ง€ํ•˜๊ณ  ์žˆ์–ด์•ผ ์‹ค๋ฌด ํ™˜๊ฒฝ์—์„œ ์›ํ™œํ•˜๊ฒŒ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋‹ค.

  2. ๋†’์€ ์ƒํƒœ ๊ด€๋ฆฌ ๋ณต์žก๋„

    • state๋Š” ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๋ฅผ ์˜๋ฏธํ•˜๋Š”๋ฐ ์›น์‚ฌ์ดํŠธ์˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์ ธ ์ปดํฌ๋„ŒํŠธ์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋งŽ์•„์ง€๋ฉด ์ƒํƒœ ๊ด€๋ฆฌ์˜ ๋ณต์žก๋„๋„ ์ฆ๊ฐ€ํ•œ๋‹ค.

    • ํฐ ๊ทœ๋ชจ์˜ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด์„œ Redux, MobX, Recoil ๋“ฑ์˜ ์™ธ๋ถ€ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

  3. ๋ฆฌ์•กํŠธ๋Š” CSR์˜ ๋žœ๋”๋ง ๋ฐฉ์‹์„ ์ฑ„ํƒํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— CSR์˜ ๋‹จ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

  4. IE8 ์ดํ•˜๋Š” ์ง€์›์ด ์•ˆ๋œ๋‹ค.

  5. View ๋งŒ์„ ๊ด€๋ฆฌํ•˜์—ฌ ๊ทธ ์ด์™ธ์˜ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง ๋“ฑ์€ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.


5. Conclusion

์ด๋ฒˆ ์ฑ•ํ„ฐ๋ฅผ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ์•„๋Š” ๊ฐœ๋… ๋ฐ ์šฉ์–ด๊ฐ€ ๋‚˜์™€์„œ ๋งŽ์ด ์นœ์ˆ™ํ–ˆ์ง€๋งŒ, ์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ, ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์˜ ๊ฐœ๋…์„ ์ดํ•ดํ•˜๋Š”๋ฐ์—๋Š” ๋งŽ์€ ์–ด๋ ค์›€์„ ๊ฒช์—ˆ๋‹ค. ์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์–ผ์ถ” ์ดํ•ด๊ฐ€ ๋˜์—ˆ์ง€๋งŒ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ ์ค‘ ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์ด ๋ฆฌ์•กํŠธ์—์„œ ์–ด๋–ป๊ฒŒ ์“ฐ์ด๋Š”์ง€ ์–ด๋–ค ๊ฐœ๋…์ธ์ง€๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐ ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ๋‹ค.(์ง€๊ธˆ๋„ ์ •ํ™•ํžˆ ์•Œ๊ณ  ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค.) ์—ฌ๋Ÿฌ ๋ธ”๋กœ๊ทธ๋“ค์„ ์ฐพ์•„๋ณด๊ณ  ์œ ํŠœ๋ธŒ๋„ ์ฐพ์•„๋ดค์ง€๋งŒ ๋ฏธ๋ฌ˜ํ•˜๊ฒŒ ์ œ๊ฐ๊ธฐ ๋‹ค๋ฅธ ์ด์•ผ๊ธฐ๋ฅผ ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์•„ ๋‹ต๋‹ตํ•œ ๋งˆ์Œ์ด ๋“ค์—ˆ๋‹ค. ๋‹ค ๋‚˜์˜ ๊ณต๋ถ€๊ฐ€ ๋ถ€์กฑํ•œ ์ด์œ ๊ฒ ์ง€.. ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์„ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ์˜๋ฌธ์ด ๋“ค์—ˆ๋˜ ์ ์€ ๋ฆฌ์•กํŠธ์˜ ํŒจํ‚ค์ง€ ๋ชจ๋“ˆ ์ค‘ useForm์œผ๋กœ ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์˜ ๋‹จ์ ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ ํ–ˆ๋Š”๋ฐ, ๊ฒฐ๊ตญ useForm์—์„œ ์‚ฌ์šฉํ•˜๋Š” getValue(), watch()๋ฉ”์†Œ๋“œ์˜ ๊ฒฝ์šฐ๋„ ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์„ ์ข€๋” ํŽธ๋ฆฌํ•˜๊ณ  ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋ผ ๋‚˜๋ฆ„ ๊ฒฐ๋ก ์„ ๋‚ด๋ ธ๋‹ค. VueJS๋Š” ์–‘๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์˜ ๋ฐฉ์‹์ด๋ผ๊ณ  ํ•˜๋Š”๋ฐ ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ๋ด๋„ ์ดํ•ด๊ฐ€ ์ž˜ ๋˜์ง€ ์•Š์•„ VueJS์„ ์ž˜ ๋‹ค๋ฃจ๋Š” ๋ถ„์—๊ฒŒ ์‚ด์ง ๋ถ€ํƒ์„ ๋“œ๋ ค์•ผ ๊ฒ ๋‹ค.


์ฐธ๊ณ 

๋ฆฌ์•กํŠธ๋ž€ ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋ณด๊ณ , ๋ฆฌ์•กํŠธ์˜ ํŠน์ง•์— ๋Œ€ํ•ด์„œ ์‚ดํŽด๋ด…๋‹ˆ๋‹ค. ์•ต๊ทค๋Ÿฌ(Angular) ๋ž€? ํŠน์ง• ๋ฐ ์žฅ๋‹จ์  ์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์„ ์–ธํ˜• VS ๋ช…๋ นํ˜•, ๋ฆฌ์•กํŠธ๊ฐ€ ์„ ์–ธํ˜•์ธ ์ด์œ  ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ vs ์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์˜ ์ดํ•ด ์–‘๋ฐฉํ–ฅ/๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ [WEB] ์–‘๋ฐฉํ–ฅ ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ [React] React ๊ฐœ๋… ๋ฐ ์žฅ๋‹จ์  ๋„์„œ - ์†Œํ”Œ์˜ ์ฒ˜์Œ ๋งŒ๋‚œ ๋ฆฌ์•กํŠธ


๐Ÿ“… 2022-07-15

Last updated