๊ด€๋ฆฌ ๋ฉ”๋‰ด

ruriruriya

[React] ๋ฆฌ์•กํŠธ - DOM(Document Object Model) ๊ฐœ๋… ๋ณธ๋ฌธ

๐Ÿ–Œ๏ธWeb/React

[React] ๋ฆฌ์•กํŠธ - DOM(Document Object Model) ๊ฐœ๋…

๋ฃจ๋ฆฌ์•ผใ…‘ 2025. 3. 10. 19:04
๋ฐ˜์‘ํ˜•

React๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค ๋ณด๋ฉด DOM(Document Object Model)์ด๋ผ๋Š” ๊ฐœ๋…์ด ์ž์ฃผ ๋“ฑ์žฅํ•œ๋‹ค.
React๋Š” ์ผ๋ฐ˜ DOM๊ณผ ๋‹ค๋ฅด๊ฒŒ ๊ฐ€์ƒ DOM(Virtual DOM)์„ ์‚ฌ์šฉํ•œ๋‹ค.
๊ทธ๋ ‡๋‹ค๋ฉด ์ผ๋ฐ˜ DOM๊ณผ ๊ฐ€์ƒ DOM์˜ ์ฐจ์ด์ , ๊ทธ๋ฆฌ๊ณ  React์—์„œ DOM์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ์ •๋ฆฌํ•ด๋ณด์ž.

 

1๏ธโƒฃ DOM์ด๋ž€?

 

โœ… DOM (๋ฌธ์„œ ๊ฐ์ฒด ๋ชจ๋ธ, Document Object Model)

  • HTML ๋ฌธ์„œ๋ฅผ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐ์ฒด ํŠธ๋ฆฌ ๊ตฌ์กฐ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒƒ์ด๋‹ค.
  • ์ฆ‰, ์›นํŽ˜์ด์ง€์˜ ๊ตฌ์กฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ธํ„ฐํŽ˜์ด์Šค๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“Œ DOM์˜ ์˜ˆ์‹œ

HTML์ด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.

<div id="app">
  <h1>์•ˆ๋…•, React!</h1>
  <button>ํด๋ฆญ</button>
</div>

โžก๏ธ ๋ธŒ๋ผ์šฐ์ €๋Š” ์ด HTML์„ DOM ํŠธ๋ฆฌ ๊ตฌ์กฐ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.

Document
 โ”œโ”€โ”€ <html>
      โ”œโ”€โ”€ <body>
           โ”œโ”€โ”€ <div id="app">
                โ”œโ”€โ”€ <h1>์•ˆ๋…•, React!</h1>
                โ”œโ”€โ”€ <button>ํด๋ฆญ</button>

JavaScript๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด DOM์„ ์ง์ ‘ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

document.getElementById("app").innerHTML = "<h1>์•ˆ๋…•, Vue!</h1>";

 

โœ… DOM์„ ์ง์ ‘ ๋ณ€๊ฒฝํ•˜๋ฉด ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ• ๊นŒ?

  • ์ง์ ‘ ๋ณ€๊ฒฝํ•˜๋ฉด ์›นํŽ˜์ด์ง€๊ฐ€ ๊นœ๋นก์ด๊ฑฐ๋‚˜, ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค.
  • ํŠนํžˆ, DOM ์กฐ์ž‘์ด ๋งŽ์•„์งˆ์ˆ˜๋ก ์›น ์„ฑ๋Šฅ์ด ๋Š๋ ค์งˆ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ’ก DOM ์—…๋ฐ์ดํŠธ๋Š” ๋ฌด๊ฒ๋‹ค!

  • HTML ์š”์†Œ๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก DOM์„ ์ง์ ‘ ์กฐ์ž‘ํ•˜๋Š” ๋น„์šฉ์ด ์ปค์ง„๋‹ค.
  • ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด React๋Š” “๊ฐ€์ƒ DOM(Virtual DOM)”์„ ๋„์ž…ํ–ˆ๋‹ค.

 

2๏ธโƒฃ Virtual DOM (๊ฐ€์ƒ DOM)์ด๋ž€?

 

โœ… ๊ฐ€์ƒ DOM์ด๋ž€?

  • React์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ๋…์œผ๋กœ, ์‹ค์ œ DOM์„ ์ง์ ‘ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ๋ฉ”๋ชจ๋ฆฌ ์•ˆ์—์„œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋จผ์ € ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.
  • ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด, “DOM์˜ ๊ฐ€๋ฒผ์šด ๋ณต์‚ฌ๋ณธ์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•ด๋‘๊ณ , ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋น„๊ตํ•ด์„œ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐฉ์‹”์ด๋‹ค.

 

๐Ÿ“Œ ๊ฐ€์ƒ DOM์ด ๋™์ž‘ํ•˜๋Š” ๊ณผ์ •

  1. React๊ฐ€ ๊ฐ€์ƒ DOM์„ ์ƒ์„ฑ (๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ DOM ํŠธ๋ฆฌ)
  2. ์ƒํƒœ(state)๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์ƒˆ๋กœ์šด ๊ฐ€์ƒ DOM์„ ์ƒ์„ฑ
  3. ๊ธฐ์กด ๊ฐ€์ƒ DOM๊ณผ ์ƒˆ๋กœ์šด ๊ฐ€์ƒ DOM์„ ๋น„๊ต (Diff ์•Œ๊ณ ๋ฆฌ์ฆ˜)
  4. ์ฐจ์ด๊ฐ€ ์žˆ๋Š” ๋ถ€๋ถ„๋งŒ ์‹ค์ œ DOM์— ์ ์šฉ (์—…๋ฐ์ดํŠธ)
  5. ํ™”๋ฉด์ด ๋ณ€๊ฒฝ๋จ (๋ฆฌ๋ Œ๋”๋ง)

 

โœ… ์ผ๋ฐ˜ DOM vs ๊ฐ€์ƒ DOM ๋น„๊ต

ํŠน์ง• ์ผ๋ฐ˜ DOM ๊ฐ€์ƒ DOM(React)
์—…๋ฐ์ดํŠธ ๋ฐฉ์‹ ์ง์ ‘ ์ˆ˜์ • ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„๋งŒ ์ˆ˜์ •
์„ฑ๋Šฅ ๋ณ€๊ฒฝ ๋งŽ์œผ๋ฉด ๋Š๋ฆผ ํšจ์œจ์  (์ตœ์†Œํ•œ์˜ ๋ณ€๊ฒฝ๋งŒ ์ ์šฉ)
์‚ฌ์šฉ ๋ฐฉ์‹ document.getElementById() ์‚ฌ์šฉ setState()๋กœ ๊ด€๋ฆฌ
๋ Œ๋”๋ง ์ตœ์ ํ™” ์—†์Œ ์žˆ์Œ (Diff ์•Œ๊ณ ๋ฆฌ์ฆ˜)

 

3๏ธโƒฃ React์—์„œ DOM์„ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฃฐ๊นŒ?

 

โœ… React์—์„œ๋Š” useState๋ฅผ ํ†ตํ•ด ์ƒํƒœ(state)๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด UI๊ฐ€ ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ๋œ๋‹ค.

import { useState } from "react";

function Counter() {
  const [count, setCount] = useState(0);

  function increase() {
    setCount(count + 1); // ์ƒํƒœ ๋ณ€๊ฒฝ
  }

  return (
    <div>
      <p>์นด์šดํŠธ: {count}</p>
      <button onClick={increase}>+1 ์ฆ๊ฐ€</button>
    </div>
  );
}

 

๐Ÿ“Œ React์—์„œ DOM ์—…๋ฐ์ดํŠธ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด์ž.

  1. setCount(count + 1); ์‹คํ–‰ → ์ƒํƒœ ๋ณ€๊ฒฝ (count๊ฐ€ 1 ์ฆ๊ฐ€)
  2. React๋Š” ์ƒˆ๋กœ์šด ๊ฐ€์ƒ DOM์„ ์ƒ์„ฑํ•˜์—ฌ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ™•์ธ
  3. ๊ธฐ์กด ๊ฐ€์ƒ DOM๊ณผ ์ƒˆ๋กœ์šด ๊ฐ€์ƒ DOM์„ ๋น„๊ตํ•ด์„œ <p> ํƒœ๊ทธ ๋‚ด์šฉ(์นด์šดํŠธ: X)๋งŒ ๋ณ€๊ฒฝ
  4. ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„๋งŒ ์‹ค์ œ DOM์— ์—…๋ฐ์ดํŠธ! (ํ™”๋ฉด์ด ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ๋ณ€ํ•จ)

 

React์—์„œ๋Š” setState()๋‚˜ useState()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด React๊ฐ€ ์ž๋™์œผ๋กœ ๊ฐ€์ƒ DOM์„ ์—…๋ฐ์ดํŠธํ•˜๊ณ , ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„๋งŒ ์‹ค์ œ DOM์— ๋ฐ˜์˜ํ•œ๋‹ค.

 

4๏ธโƒฃ React์—์„œ ์ง์ ‘ DOM์„ ์กฐ์ž‘ํ•˜๋ฉด ์•ˆ ๋˜๋Š” ์ด์œ 

์ผ๋ฐ˜์ ์œผ๋กœ React์—์„œ๋Š” document.getElementById() ๊ฐ™์€ ์ง์ ‘์ ์ธ DOM ์กฐ์ž‘์„ ํ”ผํ•ด์•ผ ํ•œ๋‹ค.

โŒ ์ž˜๋ชป๋œ ์˜ˆ์‹œ (์ง์ ‘ DOM ์กฐ์ž‘)

function App() {
  function changeText() {
    document.getElementById("title").innerText = "React๋Š” ์ข‹์•„!";
  }

  return (
    <div>
      <h1 id="title">์•ˆ๋…•, React!</h1>
      <button onClick={changeText}>ํ…์ŠคํŠธ ๋ณ€๊ฒฝ</button>
    </div>
  );
}

 

๐Ÿ’ก ์ด ์ฝ”๋“œ์˜ ๋ฌธ์ œ์ 

  • document.getElementById("title").innerText = "React๋Š” ์ข‹์•„!"; → React์˜ ์ƒํƒœ ๊ด€๋ฆฌ ๋ฐฉ์‹๊ณผ ์ถฉ๋Œํ•  ์ˆ˜ ์žˆ์Œ.
  • React๋Š” ์ƒํƒœ(useState)๋ฅผ ํ†ตํ•ด UI๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์ง์ ‘ DOM์„ ์ˆ˜์ •ํ•˜๋ฉด React๊ฐ€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ชจ๋ฅผ ์ˆ˜ ์žˆ์Œ.

 

โœ… ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ์‹ (React์˜ ์ƒํƒœ ์‚ฌ์šฉ)

import { useState } from "react";

function App() {
  const [text, setText] = useState("์•ˆ๋…•, React!");

  return (
    <div>
      <h1>{text}</h1>
      <button onClick={() => setText("React๋Š” ์ข‹์•„!")}>ํ…์ŠคํŠธ ๋ณ€๊ฒฝ</button>
    </div>
  );
}

React์˜ ์ƒํƒœ(state)๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด React๊ฐ€ ๊ฐ€์ƒ DOM์„ ํ†ตํ•ด UI๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•ด์ค€๋‹ค.

 

๊ฐœ๋…์„ค๋ช…

DOM ๋ธŒ๋ผ์šฐ์ €๊ฐ€ HTML์„ ํŠธ๋ฆฌ ๊ตฌ์กฐ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒƒ
Virtual DOM (๊ฐ€์ƒ DOM) ์‹ค์ œ DOM์„ ์ง์ ‘ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ , ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋ณ€๊ฒฝ์„ ๋จผ์ € ๊ฐ์ง€ํ•œ ํ›„ ์ตœ์†Œํ•œ์˜ ๋ณ€๊ฒฝ๋งŒ ๋ฐ˜์˜ํ•˜๋Š” React์˜ ์ตœ์ ํ™” ๊ธฐ๋ฒ•
React๊ฐ€ DOM์„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐฉ์‹ ์ƒํƒœ(state)๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด → ์ƒˆ๋กœ์šด ๊ฐ€์ƒ DOM ์ƒ์„ฑ → ์ด์ „ ๊ฐ€์ƒ DOM๊ณผ ๋น„๊ต → ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„๋งŒ ์‹ค์ œ DOM์— ์—…๋ฐ์ดํŠธ
React์—์„œ ์ง์ ‘ DOM ์กฐ์ž‘์„ ํ”ผํ•ด์•ผ ํ•˜๋Š” ์ด์œ  useState ๊ฐ™์€ React์˜ ์ƒํƒœ ๊ด€๋ฆฌ ๋ฐฉ์‹๊ณผ ์ถฉ๋Œํ•  ์ˆ˜ ์žˆ์–ด์„œ

 

ํ•œ๋งˆ๋””๋กœ ์š”์•ฝํ•˜๋ฉด “React๋Š” Virtual DOM์„ ์‚ฌ์šฉํ•ด์„œ ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„๋งŒ ํšจ์œจ์ ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค!

๋ฐ˜์‘ํ˜•