JavaScript

JavaScript ๋ฌธ์„œ ๊ฐ์ฒด ๋ชจ๋ธ(DOM)

kohi โ˜• 2022. 11. 16. 13:29
๐Ÿ’ก DOM (Document Object Model)
  • XML์ด๋‚˜ HTML ๋ฌธ์„œ์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค, ๋ฌธ์„œ ๋‚ด์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ ์ •์˜ํ•˜๊ณ  ๊ฐ๊ฐ์˜ ์š”์†Œ์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณต
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ HTML์„ ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด DOM ์‚ฌ์šฉ

 

๐Ÿ›ฐ๏ธ DOM


  • ๋ธŒ๋ผ์šฐ์ €์˜ ๋ Œ๋”๋ง ์—”์ง„์€ ํ…์ŠคํŠธ ํŒŒ์ผ๋กœ ์ƒ์„ฑ๋œ ์›น ๋ฌธ์„œ๋ฅผ ๋ธŒ๋ผ์šฐ์ € ํ™”๋ฉด์— ๋ณด์ด๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ด ์›น ๋ฌธ์„œ๋ฅผ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ๋กœ ๊ตฌ์„ฑํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ฆฌ๋Š”๋ฐ ์ด๋ฅผ DOM์ด๋ผ ํ•œ๋‹ค.
  • DOM์€ ์›น ๋ฌธ์„œ๋ฅผ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋กœ ์ •์˜ํ•˜๊ณ , ์›น ๋ฌธ์„œ๋ฅผ ์ด๋ฃจ๋Š” ํ…์ŠคํŠธ๋‚˜ ์ด๋ฏธ์ง€, ํ‘œ ๋“ฑ ๋ชจ๋“  ์š”์†Œ๋„ ๊ฐ๊ฐ ๊ฐ์ฒด๋กœ ์ •์˜ํ•œ๋‹ค. => ๋ฌธ์„œ ์ „์ฒด๋Š” document ๊ฐ์ฒด, ์ด๋ฏธ์ง€๋Š” image ๊ฐ์ฒด, ์ด๋ฏธ์ง€ ์†์„ฑ(Attribute)์ธ alt, src๋Š” image ๊ฐ์ฒด์˜ ์†์„ฑ(Property)๊ฐ€ ๋œ๋‹ค.
<!DOCTYPE html>
<html>
  <head>
    <style>
      .red  { color: #ff0000; }
      .blue { color: #0000ff; }
    </style>
  </head>
  <body>
    <div>
      <h1>Cities</h1>
      <ul>
        <li id="one" class="red">Seoul</li>
        <li id="two" class="red">London</li>
        <li id="three" class="red">Newyork</li>
        <li id="four">Tokyo</li>
      </ul>
    </div>
  </body>
</html>

DOM tree

  • DOM tree๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ HTML ๋ฌธ์„œ๋ฅผ ๋กœ๋“œํ•œ ํ›„ ํŒŒ์‹ฑํ•˜์—ฌ ์ƒ์„ฑํ•˜๋Š” ๋ชจ๋ธ์„ ์˜๋ฏธํ•œ๋‹ค. ๊ฐ์ฒด์˜ ํŠธ๋ฆฌ๋กœ ๊ตฌ์กฐํ™”๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— DOM tree๋ผ ๋ถ€๋ฅธ๋‹ค.
  • DOM์—์„œ ๋ชจ๋“  ์š”์†Œ, ์–ดํŠธ๋ฆฌ๋ทฐํŠธ, ํ…์ŠคํŠธ๋Š” ํ•˜๋‚˜์˜ ๊ฐ์ฒด์ด๋ฉฐ Document ๊ฐ์ฒด์˜ ์ž์‹์ด๋‹ค.
  • DOM tree๋Š” ๋„ค ์ข…๋ฅ˜์˜ ๋…ธ๋“œ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.
    • ๋ฌธ์„œ ๋…ธ๋“œ(Document Node): ํŠธ๋ฆฌ์˜ ์ตœ์ƒ์œ„์— ์กด์žฌํ•˜๋ฉฐ ๊ฐ๊ฐ ์š”์†Œ, ์–ดํŠธ๋ฆฌ๋ทฐํŠธ, ํ…์ŠคํŠธ ๋…ธ๋“œ์— ์ ‘๊ทผํ•˜๋ ค๋ฉด ๋ฌธ์„œ ๋…ธ๋“œ๋ฅผ ํ†ตํ•ด์•ผ ํ•œ๋‹ค. ์ฆ‰, DOM tree์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ ์‹œ์ž‘์ (entry point)์ด๋‹ค.
    • ์š”์†Œ ๋…ธ๋“œ(Element Node): ์š”์†Œ ๋…ธ๋“œ๋Š” HTML ์š”์†Œ๋ฅผ ํ‘œํ˜„ํ•œ๋‹ค. HTML ์š”์†Œ๋Š” ์ค‘์ฒฉ์— ์˜ํ•ด ๋ถ€์ž ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง€๋ฉฐ ์ด ๋ถ€์ž ๊ด€๊ณ„๋ฅผ ํ†ตํ•ด ์ •๋ณด๋ฅผ ๊ตฌ์กฐํ™”ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์š”์†Œ ๋…ธ๋“œ๋Š” ๋ฌธ์„œ์˜ ๊ตฌ์กฐ๋ฅผ ์„œ์ˆ ํ•œ๋‹ค๊ณ  ๋ง ํ•  ์ˆ˜ ์žˆ๋‹ค. ์–ดํŠธ๋ฆฌ๋ทฐํŠธ, ํ…์ŠคํŠธ ๋…ธ๋“œ์— ์ ‘๊ทผํ•˜๋ ค๋ฉด ๋จผ์ € ์š”์†Œ ๋…ธ๋“œ๋ฅผ ์ฐพ์•„ ์ ‘๊ทผํ•ด์•ผ ํ•œ๋‹ค. ๋ชจ๋“  ์š”์†Œ ๋…ธ๋“œ๋Š” ์š”์†Œ๋ณ„ ํŠน์„ฑ์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด HTMLElement ๊ฐ์ฒด๋ฅผ ์ƒ์†ํ•œ ๊ฐ์ฒด๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. (๊ทธ๋ฆผ: DOM tree์˜ ๊ฐ์ฒด ๊ตฌ์„ฑ ์ฐธ๊ณ )
    • ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๋…ธ๋“œ(Attribute Node): ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๋…ธ๋“œ๋Š” HTML ์š”์†Œ์˜ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ํ‘œํ˜„ํ•œ๋‹ค. ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๋…ธ๋“œ๋Š” ํ•ด๋‹น ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ ์ง€์ •๋œ ์š”์†Œ์˜ ์ž์‹์ด ์•„๋‹ˆ๋ผ ํ•ด๋‹น ์š”์†Œ์˜ ์ผ๋ถ€๋กœ ํ‘œํ˜„๋œ๋‹ค. ๋”ฐ๋ผ์„œ ํ•ด๋‹น ์š”์†Œ ๋…ธ๋“œ๋ฅผ ์ฐพ์•„ ์ ‘๊ทผํ•˜๋ฉด ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ์ฐธ์กฐ, ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ํ…์ŠคํŠธ ๋…ธ๋“œ(Text Node): ํ…์ŠคํŠธ ๋…ธ๋“œ๋Š” HTML ์š”์†Œ์˜ ํ…์ŠคํŠธ๋ฅผ ํ‘œํ˜„ํ•œ๋‹ค. ํ…์ŠคํŠธ ๋…ธ๋“œ๋Š” ์š”์†Œ ๋…ธ๋“œ์˜ ์ž์‹์ด๋ฉฐ ์ž์‹ ์˜ ์ž์‹ ๋…ธ๋“œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์—†๋‹ค. ์ฆ‰, ํ…์ŠคํŠธ ๋…ธ๋“œ๋Š” DOM tree์˜ ์ตœ์ข…๋‹จ์ด๋‹ค.
  • ์ •์  ์ƒ์„ฑ๊ณผ ๋™์  ์ƒ์„ฑ
    • ์ •์  ์ƒ์„ฑ: ์›น ํŽ˜์ด์ง€๋ฅผ ์ฒ˜์Œ ์‹คํ–‰ํ•  ๋•Œ HTML ํƒœ๊ทธ๋กœ ์ ํžŒ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ
    • ๋™์  ์ƒ์„ฑ: ์›น ํŽ˜์ด์ง€๋ฅผ ์‹คํ–‰ ์ค‘์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ๋ฌธ์„œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ
    • ๊ฐ์ฒด ๋ชจ๋ธ: ์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ HTML ํŒŒ์ผ์„ ๋ถ„์„ํ•˜๊ณ  ์ถœ๋ ฅํ•˜๋Š” ๋ฐฉ์‹
  • ์›น ๋ธŒ๋ผ์šฐ์ €๋Š” HTML ์ฝ”๋“œ๋ฅผ ์œ„์—์„œ ์•„๋ž˜๋กœ ์‹คํ–‰ํ•˜๋ฏ€๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ตฌ๋ฌธ์„ body ํ•˜๋‹จ์— ์ž‘์„ฑํ•ด์•ผ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์„ ๊ฒฝ์šฐ ์ด๋ฒคํŠธ๋ฅผ ํ™œ์šฉํ•ด์„œ ํ•ด๊ฒฐํ•˜๋„๋ก ํ•œ๋‹ค.

 

๐Ÿ›ฐ๏ธ DOM ๋ฉ”์„œ๋“œ


  • DOM ๋…ธ๋“œ ์ ‘๊ทผ
    • document.getElementById(): ํ•ด๋‹น ์•„์ด๋””๋ฅผ ๊ฐ€์ง„ ์š”์†Œ๋ฅผ ์„ ํƒํ•ด์„œ ๊ฐ์ฒด๋กœ ๊ฐ€์ ธ์˜ด
    • document.getElementsByTagName(): ํ•ด๋‹น ํƒœ๊ทธ์ธ ์š”์†Œ๋“ค์„ ์„ ํƒํ•ด์„œ ๋ฐฐ์—ด๋กœ ๊ฐ€์ ธ์˜ด
    • document.getElementsByClassName() : ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ ๊ฐ€์ง„ ์š”์†Œ๋“ค์„ ์„ ํƒํ•ด์„œ ๋ฐฐ์—ด๋กœ ๊ฐ€์ ธ์˜ด
    • document.querySelector(): CSS ์„ ํƒ์ž ๋ฌธ๋ฒ•์œผ๋กœ ์„ ํƒ์ž์— ํ•ด๋‹นํ•˜๋Š” ์š”์†Œ ํ•˜๋‚˜๋ฅผ ๊ฐ์ฒด๋กœ ๊ฐ€์ ธ์˜ด
    • document.querySelectorAll(): CSS ์„ ํƒ์ž ๋ฌธ๋ฒ•์œผ๋กœ ์„ ํƒ์ž์— ํ•ด๋‹นํ•˜๋Š” ์š”์†Œ๋“ค์„ ๋ฐฐ์—ด๋กœ ๊ฐ€์ ธ์˜ด
  • ํƒœ๊ทธ ์•ˆ์˜ ๋‚ด์šฉ ์ˆ˜์ •
    • innerText, textContent: ํ…์ŠคํŠธ ๋‚ด์šฉ ํ‘œ์‹œ
    • innerHTML: ํ…์ŠคํŠธ ๋‚ด์šฉ, HTML ํƒœ๊ทธ ๋ฐ˜์˜
  • ์†์„ฑ์„ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ์ˆ˜์ •
    • getAttribute(): ํƒœ๊ทธ์˜ ์†์„ฑ์„ ๋ถˆ๋Ÿฌ์˜ด
    • setAttribute(): ํƒœ๊ทธ์˜ ์†์„ฑ์„ ์ƒˆ๋กœ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•จ
  • DOM ๋…ธ๋“œ ์กฐ์ž‘
    • document.createElement(tag): ์š”์†Œ ๋…ธ๋“œ ์ƒ์„ฑ
    • createAttribute(attr): ์†์„ฑ ๋…ธ๋“œ ์ƒ์„ฑ
    • ๋…ธ๋“œ ์ƒ์„ฑ์€ ๋‹จ์ง€ ์ƒ์„ฑ๋งŒ ๋œ ๊ฒƒ์ด๊ณ  ์‹ค์ œ DOM ํŠธ๋ฆฌ์— ์ ์šฉํ•˜๊ธฐ ์ „์ž„
    • parentNode.appendChild(new): parentNode์— ๋งˆ์ง€๋ง‰ ์ž์‹์œผ๋กœ ๋…ธ๋“œ(new) ์ถ”๊ฐ€

 

๐Ÿ›ฐ๏ธ ์‚ฌ์šฉ ์˜ˆ์ œ


 

 

๐Ÿ›ฐ๏ธ Reference


https://donghyun-dev.tistory.com/20

https://tadaktadak-it.tistory.com/83

https://mathshpark-coding.tistory.com/179

https://violetboralee.medium.com/์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ-์†์„ฑ-attribute-๊ณผ-ํ”„๋กœํผํ‹ฐ-property-d2f9b772addf

https://poiemaweb.com/js-dom

https://tadaktadak-it.tistory.com/83#--%--document%--๏ฟฝ%A-%--๏ฟฝ%--%-C๏ฟฝ%--%-C