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

Ming's develop story

DOM ์˜ ๊ฐœ๋… ๋ณธ๋ฌธ

D E V E L O P ๐Ÿ’ป/CS

DOM ์˜ ๊ฐœ๋…

Ming 2025. 2. 10. 14:45

DOM (Document Object Model)์ด๋ž€?

  • ๋งˆํฌ์—… ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ๋ฌธ์„œ๋ฅผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด(ex. Javascript)๊ฐ€ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค
  • DOM์€ ๊ณ„์ธต์  ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„ ๋…ธ๋“œ ํŠธ๋ฆฌ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

DOM์˜ ์ข…๋ฅ˜

  • HTML DOM: HTML ๋ฌธ์„œ๋ฅผ ์กฐ์ž‘ํ•˜๋Š” API
  • XML DOM: XML ๋ฐ์ดํ„ฐ๋ฅผ ํŠธ๋ฆฌ ํ˜•ํƒœ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋Š” API
  • SVG DOM: SVG ๊ทธ๋ž˜ํ”ฝ์„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ ์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” API

DOM์€ ์™œ ํ•„์š”ํ•œ๊ฐ€?

  • ๋™์ ์ธ ์›น ํŽ˜์ด์ง€๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๊ฐ€ ๋ฌธ์„œ์— ์ ‘๊ทผํ•˜๊ณ , ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜๋‹จ์ด ์žˆ์–ด์•ผ ํ•˜์ง€๋งŒ ๋งˆํฌ์—… ์–ธ์–ด์—๋Š” element์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

DOM์„ ํ†ตํ•ด ์–ด๋–ค ๋™์ž‘์„ ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€?

  • ์š”์†Œ ์กฐ์ž‘: ๋ฌธ์„œ ๋‚ด์—์„œ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€(appendChild), ์ œ๊ฑฐ(removeChild), ์ˆ˜์ • ๊ฐ€๋Šฅ
  • ์†์„ฑ(Attribute) ์กฐ์ž‘: setAttribute, getAttribute ๋“ฑ์„ ํ™œ์šฉํ•˜์—ฌ ์š”์†Œ์˜ ์†์„ฑ์„ ๋ณ€๊ฒฝ
  • CSS ์Šคํƒ€์ผ ์กฐ์ž‘: element.style ๋˜๋Š” classList.add/remove ๋“ฑ์„ ์‚ฌ์šฉํ•ด ์Šคํƒ€์ผ ๋ณ€๊ฒฝ
  • ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ: addEventListener๋ฅผ ์ด์šฉํ•ด ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ

DOM์€ ์™œ ๊ณ„์ธต์  ๊ตฌ์กฐ๋กœ ํ‘œํ˜„ํ•˜๋Š”๊ฐ€?

  • ๋…ธ๋“œ๋“ค ๊ฐ„์˜ ๊ด€๊ณ„(๋ถ€๋ชจ, ์ž์‹, ํ˜•์ œ)๋ฅผ ๋ช…ํ™•ํžˆ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Œ.
  • Event ์ฒ˜๋ฆฌ์— ์œ ๋ฆฌํ•œ ๊ตฌ์กฐ์ด๋‹ค.
  • ๋…ธ๋“œ์˜ ์ถ”๊ฐ€, ์ œ๊ฑฐ, ์ด๋™ ์ž‘์—…์„ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์คŒ.
  • ์ด๋ฒคํŠธ ์ „ํŒŒ(Event Propagation) ์ฒ˜๋ฆฌ๊ฐ€ ๊ณ„์ธต ๊ตฌ์กฐ์—์„œ ํšจ์œจ์ ์œผ๋กœ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ.
    • ์บก์ฒ˜๋ง (Capturing Phase): ์ด๋ฒคํŠธ๊ฐ€ ์ตœ์ƒ์œ„ ์š”์†Œ์—์„œ ํƒ€๊ฒŸ ์š”์†Œ๋กœ ๋‚ด๋ ค๊ฐ.
    • ํƒ€๊ฒŸ ๋‹จ๊ณ„ (Target Phase): ์‹ค์ œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ ์š”์†Œ์—์„œ ์‹คํ–‰๋จ.
    • ๋ฒ„๋ธ”๋ง (Bubbling Phase): ์ด๋ฒคํŠธ๊ฐ€ ๋‹ค์‹œ ์ƒ์œ„ ์š”์†Œ๋กœ ์˜ฌ๋ผ๊ฐ.

๐Ÿ’ก event.stopPropagation()์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ฒคํŠธ ์ „ํŒŒ๋ฅผ ์ค‘๋‹จํ•  ์ˆ˜ ์žˆ์Œ.


DOM์˜ ์ฃผ์š” ๊ฐ์ฒด

  • document: HTML ๋ฌธ์„œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ตœ์ƒ์œ„ ๊ฐ์ฒด
  • window: ๋ธŒ๋ผ์šฐ์ € ์ฐฝ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด, document๋Š” window ๊ฐ์ฒด์˜ ์†์„ฑ
  • element: DOM์—์„œ HTML ์š”์†Œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด (getElementById(), querySelector() ๋“ฑ์œผ๋กœ ์ ‘๊ทผ)
  • node: ๋ชจ๋“  ์š”์†Œ, ์†์„ฑ, ํ…์ŠคํŠธ๋ฅผ ํฌํ•จํ•˜๋Š” ์ตœ์ƒ์œ„ ๊ฐœ๋… (Element, Text, Comment ๋“ฑ ํฌํ•จ)

DOM ์กฐ์ž‘ ์‹œ ์„ฑ๋Šฅ ์ตœ์ ํ™”

  • DOM ์กฐ์ž‘ ์ตœ์†Œํ™”: documentFragment๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€
  • reflow/repaint ์ตœ์†Œํ™”: ์—ฌ๋Ÿฌ ์Šคํƒ€์ผ ๋ณ€๊ฒฝ ์‹œ classList๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํ•œ ๋ฒˆ์— ์ ์šฉ
  • Virtual DOM ํ™œ์šฉ: React ๋“ฑ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” Virtual DOM์„ ์‚ฌ์šฉํ•ด ์„ฑ๋Šฅ ์ตœ์ ํ™”

'D E V E L O P ๐Ÿ’ป > CS' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

๋™๊ธฐ(Synchronous), ๋น„๋™๊ธฐ(Asynchronous)  (0) 2025.02.14
Promise๋ž€?(feat. async-await, Promise.all())  (0) 2025.02.12
Comments