>TIL: DOM์ด๋ž€?

ํƒœํ˜„ยท2021๋…„ 3์›” 14์ผ
2

๐Ÿ™‹๐Ÿปโ€โ™€๏ธ ๋ชฉํ‘œ: ๋ฉด์ ‘์„ ์ค€๋น„ํ•˜๊ธฐ ์ด์ „์— ์•Œ์•˜๋˜ ๋‚ด์šฉ๋“ค์— ๋Œ€ํ•œ ๊ฐœ๋…์„ ์ •๋ฆฌํ•ด ๋ณด์ž.

1. DOM์„ ๊นจ์šฐ์น˜๋‹ค.


๐Ÿ™ŒMDN ์›น ๋ฌธ์„œ์— ๋”ฐ๋ฅด๋ฉด ๋”์€ ์›น ๋ธŒ๋ผ์šฐ์ € ์ œ์กฐ์‚ฌ์—์„œ ๋งŒ๋“  Web APIs์ค‘์—์„œ ๋ฌธ์„œ๊ฐ์ฒด๋ชจ๋ธ์ด๋‹ค. ๋ฌด์Šจ ๋ง์ธ์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ๊ฐํ•ด ๋ณด์ž.

JS ์ž…์žฅ์—์„œ HTML์„ ์—ฐ๊ฒฐํ•˜๊ณ  ๋ฐ›์•˜์„ ๋•Œ ๋ฌธ์„œ๋Š” ์–ด๋–ค ๋ฐ์ดํ„ฐ๋กœ ๋ณด์ผ๊นŒ? ๋ฐ”๋กœ ๋ฌธ์ž์—ด์ด๋‹ค. img ํƒœ๊ทธ๋ผ๊ณ  ์•Œ๋ ค์ค€ ๊ฒƒ๋„ JS๋Š” ๋ฌธ์ž์—ด๋กœ ๋ณด๊ธฐ ๋•Œ๋ฌธ์— ํƒœ๊ทธ์˜ ์˜๋ฏธ๊ฐ€ ์—†๋˜ ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ JS๋Š” ์ตœ์†Œํ•œ์˜ ์–ด๋Š์ •๋„ ์˜๋ฏธ๊ฐ€ ์žˆ๋Š” ๋‹จ์œ„๋กœ ์ชผ๊ฐฏ์–ด์•ผ ํ–ˆ์—ˆ๋‹ค.

2. DOM์ด๋ž€


JS๋Š” ํƒœ๊ทธ์˜ ๊ด€๊ณ„๋„๋ฅผ ์•Œ๊ณ  ์‹ถ์—ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฌธ์„œ ์ „์ฒด๋ฅผ ํ•œ ๊ฐ€๋ฌธ์˜ ํ˜•ํƒœ๋กœ ๋งŒ๋“ค๊ธฐ ์‹œ์ž‘ํ–ˆ๊ณ  ์ •๋ณด๋„ ์„ธ์„ธํ•˜๊ฒŒ ๊ธฐ์ž…ํ–ˆ์œผ๋ฉฐ ๊ธฐ์ž…ํ•œ ์ž๋ฃŒ๋Š” ์˜ค๋ธŒ์ ํŠธ ํ˜•์‹์œผ๋กœ ๋‚จ๊ฒผ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด ์ •๋ณด ํ•˜๋‚˜ํ•˜๋‚˜๋ฅผ ๋…ธ๋“œ ๋ผ๊ณ  ๋ถ€๋ฅด์ž๊ณ  ์•ฝ์†ํ•˜์˜€๋‹ค.

const child1 = {
    nodeType: 1.
    nodeName: 'div',
    childNode: [],
    attributes: []
}

3. Node


๋…ธ๋“œ๋Š” HTML๋ฌธ์„œ ์ „๋ฐ˜์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค.

document.querySelector ๋ฅผ ์•„๋Š”๊ฐ€. ์šฐ๋ฆฌ๋Š” childNode nextSibling ๊ณผ ๊ฐ™์€ ์ง๊ด€์ ์œผ๋กœ๋„ ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ํ†ตํ•ด ๊ด€๊ณ„๋ฅผ ์ดํ•ดํ•˜๊ฒŒ ๋˜์—ˆ๊ณ , ๊ฒฐ๊ตญ JS ์—”์ง„์€ ์ด๋“ค ์‚ฌ์ด๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

4. Node๋ฅผ ํ†ตํ•ด


'DOM์„ ๊นจ์šฐ์น˜๋‹ค' ๋ผ๋Š” ์ฑ…์„ ๋ณด๋ฉด ๋…ธ๋“œ๋Š” ๋Œ€ํ‘œ์ ์œผ๋กœ ๋งŽ์ด ์“ฐ์ด๋Š” ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

๋ฌผ๋ก  ๋‹ค๋ฅธ ๊ฒƒ๋„ ์“ฐ์ด์ง€๋งŒ ํ˜„์žฌ ํŽ˜์ด์ง€์—์„œ๋Š” ๋‘ ๊ฐ€์ง€๋งŒ ๋‹ค๋ฃฌ๋‹ค.

// (1)Document Nodes
// -HTML๋ฌธ์„œ ์ „๋ฐ˜์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ–๊ณ  ์žˆ์Œ
// -document.querySelector(๋Œ€ํ‘œ์ )

// (2)Element Nodes
// -node์˜ ์ง„์งœ ์‹ค์šฉ์ ์ธ ๋ถ€๋ถ„
// -element = ํƒœ๊ทธ
// -์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ธฐ๋Šฅ: getAttribute(), setAttribute(), classList(), ๋“ฑ๋“ฑ...
console.log(atts.getAttribute('title')); //์†์„ฑ๊ฐ’ ์ฐพ๊ธฐ
console.log( //์žˆ๋Š”๊ฐ€ & ์—†๋Š”๊ฐ€
    atts.hasAttribute('href'),
    atts.hasAttribute('title'),
    atts.hasAttribute('style'),
    atts.hasAttribute('data-foo'),
)
console.log(atts.setAttribute('style')) //์†์„ฑ๊ฐ’ ์ง€์ •ํ•˜๊ธฐ

// โญ๏ธ๊ถ๊ธˆ3)classList๋ž€?
// -๊ธฐ๋Šฅ: add, remove, toogle
parent.classList.add('hello') //์ตœ์‹ ์˜ ์ƒˆ๋กญ๊ฒŒ ์ƒ๊ธด ๋ฐฉ์‹
// โ€ฃ<div class="parent hello">
parent.setAttribute('class', 'hello') //์˜›๋‚ ์˜ ๋ถˆํŽธํ–ˆ๋˜ ๋ฐฉ์‹
// โ€ฃ<div class="hello">
parent.classList.toogle('visible'); //on & off
// โญ๏ธ๊ถ๊ธˆ4)๋˜ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ
parent.innerHTML = '<div>hello</div>'
// โ€ฃ"<div>hello</div>"
parent.innerText = 'bye' //ํ…์ŠคํŠธ๋งŒ ๋ฐ”๊พธ๊ณ  ์‹ถ์„ ๋•Œ
// โ€ฃ"bye"

4. ๋งฅ๋ฝ ์ •๋ฆฌ


๋”์€ ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋งŒ๋“  Web APIs์˜ ๋ฌธ์„œ๊ฐ์ฒด๋ชจ๋ธ์ด๋‹ค. DOM์—์„œ ๋‚˜์˜ค๋Š” ์กฐ์ž‘๊ณผ ์ด๋ฒคํŠธ๊ฐ€ ์ค‘์š”ํ•œ๋ฐ ๋Œ€ํ‘œ์ ์œผ๋กœ document node element node event handling ์ด ์žˆ๋‹ค. ๋”์€ JS๋ฅผ ๋ฐœ์ „์‹œ์ผฐ๊ณ  ๊ทธ๋“ค๋งŒ์˜ ๊ฐ•๋ ฅํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ํ˜•์„ฑ๋˜์—ˆ์œผ๋ฉฐ ๋…์ž์ ์œผ๋กœ ๋ฐœ์ „ํ•˜์—ฌ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋ง์˜ ๋ฐฉ์‹์„ ์ข€ ๋” ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•ด ๋‚ด๊ธฐ ์œ„ํ•œ ๋„๊ตฌ๋ฅผ ๋งŒ๋“ค์–ด๋ƒˆ๋‹ค. ํ˜„์žฌ ๋ฆฌ์•กํŠธ, ์ œ์ด์ฟผ๋ฆฌ, ๋„ ์กฐ, ๋ชจ ํˆด์ฆˆ๋ฅผ ํƒ„์ƒ์‹œํ‚จ ๊ฒƒ์ด๋‹ค.

4. ์•Œ๋ฉด ์ข‹์€ ์šฉ์–ดโœจ


// ์šฉ์–ด์ •๋ฆฌ๐Ÿ”ฅ
// (1) DOM: HTML, XML๊ณผ ๊ฐ™์€ ๋ฌธ์„œ๋ฅผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ๋ฌธ์„œ๊ฐ์ฒด๋ชจ๋ธ
// (2) Parse: ๋ฌธ์žฅ์„ ๋ฌธ๋ฒ•์ ์œผ๋กœ ๋ถ„์„ํ•˜๋‹ค, ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ parse๋Š” ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ๋ฌธ์„œ๋ฅผ ๋””์ฝ”๋”ฉ ํ•œ๋‹ค๋Š” ๋œป
// (3) Parsing: Parse์˜ ์ง„ํ–‰ํ˜•, ๋ฌธ์ž๋ฅผ ์˜๋ฏธ์žˆ๋Š” ๊ฐ์ฒด๋กœ ๋งŒ๋“œ๋Š” ์ž‘์—…(HTML์„ parsingํ•ด์„œ DOM์˜ ํ˜•ํƒœ๋กœ ๋งŒ๋“ ๋‹ค.)
// (4) node: ๋ฐ”๊พธ๋Š” ํ˜•ํƒœ(๋„๋Œ€์ฒด ๋ฌด์—‡์œผ๋กœ ๋ฐ”๊พธ๋Š” ๊ฐ€์— ๋Œ€ํ•œ ์ •๋‹ต, JS๋กœ ์กฐ์ž‘+์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด ์ชผ๊ฐœ๋†“์€ ํ˜•ํƒœ)
// -์ข…๋ฅ˜: ๋ฌด์ˆ˜ํžˆ ๋งŽ์Œ
// ํƒœ๊ทธ์ž์ฒด: ELEMENT_NODE = 1
// ํƒœ๊ทธ์•ˆ์˜์†์„ฑ: ATTRIBUTE_NODE = 2
// ํ…์ŠคํŠธ์ •๋ณด: TEXT_NODE = 3
// ์ฝ”๋ฉ˜ํŠธ์ •๋ณด: COMMENT_NODE = 8
// โ‡ฃ
// -์ปจ์…‰: node๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•œ ๊ฐ€๋ฌธ์˜ ๊ด€๊ณ„์— ๊ด€ํ•œ ๊ฒƒ๋“ค์ด ๋งŽ์Œ(ํŠธ๋ฆฌ์†์˜ ๊ด€๊ณ„, e.g., lastChild, nextSibling, parentNode, previousSibling, ...)
// (5) traverse: ํšก๋‹จ(JS์—์„œ์˜ ๋œป์€ "ํƒ€๊ณ ํƒ€๊ณ ํƒ€๊ณ  ๋‚ด๋ ค๊ฐ€์„œ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์„ ์ฐพ๋Š” ๊ฒƒ.  ๋…ธ๋“œํƒ€์ž… = 3 ์ด๋ผ๊ณ  ์•Œ๋ ค์ฃผ๋Š” ๊ฒƒ๊ณผ ๊ทธ๊ฒƒ์„ ์ฐพ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๊ธฐ๋ณธ์ ์œผ๋กœ JS์—”์ง„์—์„œ๋Š” traverseํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•จ")

// 4. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์ปดํŒŒ์ผ ์–ธ์–ด์ด์ž ์ธํ„ฐํ”„๋ฆฌํ„ฐ ์–ธ์–ด์ธ ์ด์œ 
// -์„ค๋ช…: JS์—”์ง„์€ ๋ฌธ์„œ๋ฅผ ๊ธฐ๊ณ„์นœํ™”์–ด๋กœ ๋ฐ”๊พผ ๋‹ค์Œ(์ปดํŒŒ์ผ)-> ๊ทธ ๊ฒฐ๊ณผ๋ฌผ์„ ์ฝ์Œ(์ธํ„ฐํ”„๋ฆฌํŠธ)
// -์ปจ์…‰์ด์œ : ์–‘์ชฝ์˜ ์žฅ์ ์„ ๋ชจ๋‘ ์–ป๊ธฐ ์œ„ํ•จ๐Ÿ”ฅ
profile
์•ˆ๋…•ํ•˜์„ธ์š”, ์ง€์‹์„ ๊ณต์œ ํ•˜๋Š” ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค.

2๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2021๋…„ 3์›” 17์ผ

๋ธ”๋ž™๊ฐ€๋ฌธ ใ…‹ใ…‹ใ…‹ใ…‹ ๋น„์œ ๊ฐ€ ์ฐฐ์ง€๋„ค์š” ใ…‹ใ…‹

1๊ฐœ์˜ ๋‹ต๊ธ€