๐Ÿ“˜ [Recat] React๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ : Vanilla JS์™€์˜ ๋น„๊ต

๐Ÿ“˜ [Recat] React๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ : Vanilla JS์™€์˜ ๋น„๊ต

[React] React๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ : Vanilla JS์™€์˜ ๋น„๊ต

์›น ๊ฐœ๋ฐœ์„ ์ฒ˜์Œ ์‹œ์ž‘ํ–ˆ์„ ๋•Œ ๋Œ€๋ถ€๋ถ„์€ ์ˆœ์ˆ˜ํ•œ JavaScript๋กœ DOM์„ ์ œ์–ดํ•˜๊ณ  ์ด๋ฒคํŠธ๋ฅผ ๋‹ค๋ฃจ๋ฉฐ UI๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
์ด ๋ฐฉ์‹์„ ํ”ํžˆ Vanilla JS๋ผ๊ณ  ๋ถ€๋ฅด์ฃ . ์ € ์—ญ์‹œ ์ฒ˜์Œ์—๋Š” ์ด ๋ฐฉ์‹์œผ๋กœ ์ถฉ๋ถ„ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ”„๋กœ์ ํŠธ๊ฐ€ ์ ์  ๋ณต์žกํ•ด์ง€๊ณ  UI์˜ ๋™์  ์š”์†Œ๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก ํ•œ๊ณ„๊ฐ€ ๋“œ๋Ÿฌ๋‚ฌ์Šต๋‹ˆ๋‹ค.

๊ทธ ๊ณผ์ •์—์„œ ์ œ๊ฐ€ ์„ ํƒํ•œ ๋„๊ตฌ๊ฐ€ ๋ฐ”๋กœ React์ž…๋‹ˆ๋‹ค.
์ด ๊ธ€์—์„œ๋Š” React๋ฅผ ์™œ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ๋Š”์ง€, Vanilla JS์™€ ๋น„๊ตํ•˜๋ฉด์„œ ์ •๋ฆฌํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๐Ÿ” 1. DOM ์ œ์–ด ๋ฐฉ์‹์˜ ์ฐจ์ด

Vanilla JS๋Š” HTML ์š”์†Œ๋ฅผ ์„ ํƒํ•ด์„œ ์ง์ ‘ ์กฐ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

document.getElementById('title').innerText = 'Hello World';

์ด ๋ฐฉ์‹์€ ๊ฐ„๋‹จํ•˜์ง€๋งŒ, ์ƒํƒœ๊ฐ€ ์ž์ฃผ ๋ฐ”๋€Œ๋Š” UI์—๋Š” ๊ต‰์žฅํžˆ ๋น„ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค. ๋งค๋ฒˆ DOM์„ ์ฐพ์•„์„œ ๋ฐ”๊พธ๋Š” ๋ฐ˜๋ณต์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

React๋Š” Virtual DOM์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„๋งŒ ํšจ์œจ์ ์œผ๋กœ ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค.

const [title, setTitle] = useState('Hello World');
return 

์ƒํƒœ๊ฐ€ ๋ฐ”๋€Œ๋ฉด ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ž๋™์œผ๋กœ ๋ฆฌ๋ Œ๋”๋ง๋˜๋ฉฐ, ์‹ค์ œ DOM์—๋Š” ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค.

๐Ÿงฉ 2. ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜์˜ ๊ตฌ์กฐํ™”

Vanilla JS์—์„œ๋Š” UI์˜ ๊ฐ ๋ถ€๋ถ„์„ ํ•จ์ˆ˜๋กœ ๋ถ„๋ฆฌํ•˜๊ฑฐ๋‚˜ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ณต๋˜๋Š” HTML ๊ตฌ์กฐ๋ฅผ ๋ณต๋ถ™ํ•˜๊ฑฐ๋‚˜, ๋ฌธ์ž์—ด๋กœ innerHTML์„ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

React์—์„œ๋Š” UI๋ฅผ ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„๋กœ ์ชผ๊ฐœ๊ณ  ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

function Button({ text }) {
  return <button>{text}</button>;
}

์ด๋Ÿฐ ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ๋Š” ์œ ์ง€๋ณด์ˆ˜์™€ ํ™•์žฅ์— ๋งค์šฐ ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ”„ 3. ์ƒํƒœ ๊ด€๋ฆฌ์˜ ํŽธ์˜์„ฑ

Vanilla JS๋กœ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋ ค๋ฉด ์ „์—ญ ๋ณ€์ˆ˜์™€ ๋ณต์žกํ•œ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

let count = 0;
function increment() {
  count++;
  document.getElementById('counter').innerText = count;
}

React์—์„œ๋Š” useState๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํƒœ๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

const [count, setCount] = useState(0);
return (
  <div>
    <p>{count}</p>
    <button onClick={() => setCount(count + 1)}>์ฆ๊ฐ€</button>
  </div>
);

๋ณ€์ˆ˜ ๊ด€๋ฆฌ, ํ™”๋ฉด ๊ฐฑ์‹ , ์ด๋ฒคํŠธ ์—ฐ๊ฒฐ ๋ชจ๋‘ ํ•˜๋‚˜์˜ ๊ตฌ์กฐ ์•ˆ์—์„œ ๊น”๋”ํ•˜๊ฒŒ ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

๐Ÿš€ 4. UI ๋ณต์žก์„ฑ ๋Œ€์‘

์›น ์•ฑ์˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๋ฉด ํŽ˜์ด์ง€๋งˆ๋‹ค ์ˆ˜์‹ญ, ์ˆ˜๋ฐฑ ๊ฐœ์˜ DOM ์š”์†Œ์™€ ์ด๋ฒคํŠธ๊ฐ€ ๋’ค์„ž์ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. Vanilla JS์—์„œ๋Š” ๊ฐ ์ƒํƒœ์™€ ์š”์†Œ๋ฅผ ์—ฐ๊ฒฐํ•˜๊ณ  ์ถ”์ ํ•˜๋Š” ๋ฐ ๋งŽ์€ ์ฝ”๋“œ์™€ ๋ณต์žก๋„๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

React๋Š” ์ƒํƒœ ๊ธฐ๋ฐ˜ ๋ Œ๋”๋ง๊ณผ ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ ๋•๋ถ„์— UI๊ฐ€ ๋ณต์žกํ•ด์ ธ๋„ ๋ช…ํ™•ํ•œ ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐ŸŒ 5. ์ƒํƒœ๊ณ„์™€ ํ™•์žฅ์„ฑ

React๋Š” ๋‹จ์ˆœํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋„˜์–ด์„  ํ’๋ถ€ํ•œ ์ƒํƒœ๊ณ„๋ฅผ ์ž๋ž‘ํ•ฉ๋‹ˆ๋‹ค.

  • Next.js โ†’ ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง, SEO ์ง€์›
  • React Router โ†’ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋ผ์šฐํŒ…
  • Redux, Zustand โ†’ ๋ณต์žกํ•œ ์ƒํƒœ ๊ด€๋ฆฌ
  • Tailwind, styled-components โ†’ ๋‹ค์–‘ํ•œ ์Šคํƒ€์ผ๋ง ๋ฐฉ๋ฒ•
  • ๋ฐ˜๋ฉด, Vanilla JS๋กœ๋Š” ์ด๋Ÿฐ ๊ธฐ๋Šฅ์„ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งค๋ฒˆ ๋”ฐ๋กœ ์—ฐ๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“ ๋ช…๋ นํ˜•๊ณผ ์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ฐจ์ด

๋ช…๋ นํ˜•(Imperative)๊ณผ ์„ ์–ธํ˜•(Declarative) ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ฐจ์ด๋Š” โ€œ์–ด๋–ป๊ฒŒ(How) ์ฒ˜๋ฆฌํ• ์ง€๋ฅผ ์ง์ ‘ ๋ช…์‹œํ•˜๋А๋ƒ(๋ช…๋ นํ˜•)โ€ vs โ€œ๋ฌด์—‡(What)์„ ํ• ์ง€๋ฅผ ์„ ์–ธํ•˜๋А๋ƒ(์„ ์–ธํ˜•)โ€๋กœ ์š”์•ฝ๋ฉ๋‹ˆ๋‹ค.

์‹ค์ƒํ™œ๋กœ ์˜ˆ์‹œ

  • ๋ช…๋ นํ˜• : ๊ฐ•๋‚จ์—ญ ์ง€ํ•˜์ฒ ์—์„œ ๋‚ด๋ ค์„œ 500m ์ง์ง„ํ•ด์„œ ์‚ฌ๊ฑฐ๋ฆฌ์—์„œ ์ขŒํšŒ์ „ 50m ์ง์ง„
  • ์„ ์–ธํ˜• : ์„œ์šธํŠน๋ณ„์‹œ ์„œ์ดˆ๊ตฌ ๊ฐ•๋‚จ๋Œ€๋กœ 444๊ธธ

React๋Š” ๋Œ€ํ‘œ์ ์ธ ์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. ์•„๋ž˜์— ๊ฐ™์€ ๋™์ž‘์„ ๋ช…๋ นํ˜• vs ์„ ์–ธํ˜•์œผ๋กœ ๊ตฌํ˜„ํ•œ ์˜ˆ์‹œ๋ฅผ ๋ณด์—ฌ๋“œ๋ฆด๊ฒŒ์š”.

โœ… ์˜ˆ์‹œ: ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ๋ฆฌ์ŠคํŠธ์— ์•„์ดํ…œ ์ถ”๊ฐ€ํ•˜๊ธฐ

๐Ÿ”ป ๋ช…๋ นํ˜• ๋ฐฉ์‹ (Vanilla JS)

<!DOCTYPE html>
<html>
<body>
  <ul id="list"></ul>
  <button onclick="addItem()">Add Item</button>

  <script>
    let count = 1;
    function addItem() {
      const ul = document.getElementById('list');
      const li = document.createElement('li');
      li.textContent = 'Item ' + count++;
      ul.appendChild(li);
    }
  </script>
</body>
</html>

โžก๏ธ ์–ด๋–ป๊ฒŒ DOM์„ ์กฐ์ž‘ํ• ์ง€ ํ•˜๋‚˜ํ•˜๋‚˜ ์ง€์‹œํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

๐Ÿ”บ ์„ ์–ธํ˜• ๋ฐฉ์‹ (React)

import { useState } from 'react';

function ItemList() {
  const [items, setItems] = useState([]);

  const addItem = () => {
    setItems([...items, `Item ${items.length + 1}`]);
  };

  return (
    <div>
      <ul>
        {items.map((item, i) => <li key={i}>{item}</li>)}
      </ul>
      <button onClick={addItem}>Add Item</button>
    </div>
  );
}

โžก๏ธ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์–ด๋–ค ์ƒํƒœ์—ฌ์•ผ ํ•˜๋Š”์ง€๋งŒ ์„ ์–ธํ•˜๊ณ , React๊ฐ€ UI๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

  • ๋ช…๋ นํ˜•: ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค๊ณ , ์š”์†Œ๋ฅผ ๋งŒ๋“ค๊ณ , ๊ทธ๊ฑธ DOM์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ณผ์ •์„ ์ง์ ‘ ์ˆœ์„œ๋Œ€๋กœ ์ง€์‹œํ•จ.
  • ์„ ์–ธํ˜•: โ€œ๋ฆฌ์ŠคํŠธ๋Š” items ์ƒํƒœ๋กœ ํ‘œํ˜„๋˜๊ณ , ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•œ๋‹คโ€๊ณ  ์ƒํƒœ๋งŒ ์„ ์–ธํ•จ.

๐Ÿง  ์ฐจ์ด ์š”์•ฝ

๊ตฌ๋ถ„๋ช…๋ นํ˜• (Imperative)์„ ์–ธํ˜• (Declarative)
ํ•ต์‹ฌ ์งˆ๋ฌธ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ• ์ง€๋ฅผ ์„ค๋ช…ํ•œ๋‹ค๋ฌด์—‡์ด ํ•„์š”ํ•œ์ง€๋ฅผ ์„ค๋ช…ํ•œ๋‹ค
๊ฐœ๋ฐœ์ž๊ฐ€ ํ•˜๋Š” ์ผDOM ์กฐ์ž‘์„ ์ง์ ‘ ํ•จ (์ ˆ์ฐจ ์ค‘์‹ฌ)์ƒํƒœ๋งŒ ์„ ์–ธํ•˜๋ฉด React๊ฐ€ ์•Œ์•„์„œ ์ฒ˜๋ฆฌํ•จ
์˜ˆ: ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ๋ฆฌ์ŠคํŠธ ์ถ”๊ฐ€createElement, appendChild ๋“ฑ ์ง์ ‘ ์‚ฌ์šฉuseState๋กœ ์ƒํƒœ ์„ ์–ธ, JSX๋กœ UI ํ‘œํ˜„

๐Ÿ“Œ ์ •๋ฆฌ

ํ•ญ๋ชฉVanilla JSReact
DOM ์ œ์–ด์ง์ ‘ ์ˆ˜๋™ ์ œ์–ดVirtual DOM ์ž๋™ ์ฒ˜๋ฆฌ
UI ๊ตฌ์„ฑHTML ์กฐ๊ฐ ๋ณต๋ถ™์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐํ™”
์ƒํƒœ ๊ด€๋ฆฌ๋ณ€์ˆ˜์™€ DOM ์ˆ˜๋™ ์—ฐ๋™useState๋กœ ๊น”๋”ํ•œ ์ƒํƒœ ์ฒ˜๋ฆฌ
์žฌ์‚ฌ์šฉ์„ฑ๊ฑฐ์˜ ์—†์Œ๋†’์Œ
์œ ์ง€๋ณด์ˆ˜์–ด๋ ต๊ณ  ์ฝ”๋“œ ์ค‘๋ณต ๋งŽ์Œ๊ตฌ์กฐํ™” ์‰ฌ์›€
ํ•™์Šต ๋‚œ์ด๋„์‰ฌ์›€์ค‘๊ฐ„
ํ™•์žฅ์„ฑ์ œํ•œ์ ๋งค์šฐ ๋†’์Œ
๋ฐฉ์‹๋ช…๋ นํ˜•์„ ์–ธํ˜•

โœ๏ธ ๋งˆ๋ฌด๋ฆฌ

์ฒ˜์Œ์—๋Š” Vanilla JS๋กœ๋„ ์ถฉ๋ถ„ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ,
React๋ฅผ ์ ‘ํ•œ ์ดํ›„๋กœ ๊ฐœ๋ฐœ ํšจ์œจ, ์œ ์ง€๋ณด์ˆ˜, ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ๋ชจ๋‘์—์„œ ํฐ ์ฐจ์ด๋ฅผ ๋А๊ผˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์— ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋ฉด React๋Š” ๊ผญ ์ตํ˜€์•ผ ํ•  ๋„๊ตฌ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
์•ž์œผ๋กœ JSX, ํ›…(Hooks), ๋ผ์šฐํŒ…, ์ƒํƒœ ๊ด€๋ฆฌ ๋“ฑ React์˜ ๋‹ค์–‘ํ•œ ์ฃผ์ œ๋กœ ๊ธ€์„ ์ด์–ด๊ฐ€ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๐Ÿ“‘ Reference



Pagination


ยฉ 2025. All rights reserved.

Powered by Hydejack v9.2.1