DOM(Document Object Model)
โ HTML โ 11 min read
๐ก ์ด ํฌ์คํ ์ DOM์ ๋ํด ๊ณต๋ถํ๋ฉฐ ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค. ํน์ฌ๋ ์ผ๋ถ ์ฌ๋ฐ๋ฅด์ง ์์ ์ ๋ณด๊ฐ ์์ ์์ ์ง์ ํด์ฃผ์๋ฉด ์ ์ ํ ๋กํ๊ฒ ์ต๋๋ค.
๊ฐ์ ๐ซ
DOM์ ๋ํ ์ดํด์ ์ ๊ทผ ๋ฐฉ๋ฒ์ ๋ํด ๊ณต๋ถํ๊ณ , ๊ฐ๋จํ ํ๋ก์ ํธ๋ฅผ ์ ์ํฉ๋๋ค.
์ด๋ฒ ํฌ์คํ ์์๋ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ ๊ฝ๐ป์ธ DOM์ ๋ํ ๋ด์ฉ์ ์ ๋ฆฌํด๋ณด๊ณ ์ ํ๋ค.
DOM์ ๊ตฌ์กฐ์ ์ ๊ทผ๋ฐฉ๋ฒ(๋ฉ์๋)์ ๋ํด ์ ๋ฆฌํ๊ณ . DOM๊ณผ ๊ด๋ จ๋ ๊ฐ๋จํ ์์ด๋์ด๊ฐ ๋ ์ฌ๋ผ ๊ธฐ๋ฅ์ ์ ์ํด๋ณด๊ณ ์ํ๋ค.
Document Object Model ๐
DOM ์ด๋?
๋ฌธ์ ๊ฐ์ฒด ๋ชจ๋ธ(The Document Object Model, ์ดํ DOM) ์ HTML, XML ๋ฌธ์์ ํ๋ก๊ทธ๋๋ฐ interface ์ด๋ค. DOM์ ๋ฌธ์์ ๊ตฌ์กฐํ๋ ํํ(structured representation)์ ์ ๊ณตํ๋ฉฐ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๊ฐ DOM ๊ตฌ์กฐ์ ์ ๊ทผํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ฌ ๊ทธ๋ค์ด ๋ฌธ์ ๊ตฌ์กฐ, ์คํ์ผ, ๋ด์ฉ ๋ฑ์ ๋ณ๊ฒฝํ ์ ์๊ฒ ๋๋๋ค. DOM ์ nodes์ objects๋ก ๋ฌธ์๋ฅผ ํํํ๋ค.
- mdn web docs
์ ์ ์์ ๋์์๋ DOM ๊ตฌ์กฐ์ ์ ๊ทผํ๊ณ ๋ด์ฉ์ ๋ณ๊ฒฝํ๋๋ก ๋๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด
๋ javaScript
๋ผ๊ณ ํ ์ ์๋ค.
๊ฐ๋จํ๊ฒ ์ค๋ช ํ๊ธฐ ์ํด ๊ธฐ๋ณธ์ ์ธ HTML ๋ฌธ์๋ฅผ ๋ง๋ค์ด๋ณด์.
<!DOCTYPE html><html lang="en"><head> <title>Basic HTML</title></head><body> <div id="root">Helloo</div></body></html>
์ HTML์ ๊ตฌ์กฐํ๋ ํํ์ ์ ๊ณตํ๋ ๊ฒ์ด DOM์ด๋ค.
javascript๋ฅผ ์ฌ์ฉํ๋ฉด ์ HTML์ ๊ตฌ์กฐ์ ์ ๊ทผํ์ฌ ๋ด์ฉ์ ๋ณ๊ฒฝํ๊ฑฐ๋ ์คํ์ผ์ ์์ ํ ์ ์๋ ๊ฒ์ด๋ค.
console.log, dir๋ก ๊ฐ๊ฐ document.body
๋ฅผ ์ฐ์ด๋ณด๋ฉด

์์ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ์ถ๋ ฅ๋๋ค.
- console.log๋ ์์๋ฅผ HTML๊ณผ ๊ฐ์ ํธ๋ฆฌ ๊ตฌ์กฐ๋ก ์ถ๋ ฅ.
- console.dir์ ์์๋ฅผ JSON๊ณผ ๊ฐ์ ํธ๋ฆฌ ๊ตฌ์กฐ๋ก ์ถ๋ ฅ.
HTML๊ณผ javaScript๋ฅผ ๊ฐ์ง๊ณ ์ฃผ์ด์ง ๋ฉ์๋๋ฅผ ํ์ฉํ๋ฉด DOM์ ์กฐ์ํ์ฌ ์น ์๋น์ค๋ฅผ interactiveํ๊ฒ ์ ์ํ ์ ์๋ ๊ฒ์ด๋ค.
DOM์ ์กฐ์ํ๋ ๊ณผ์ ์์ DOM ๋ ๋๋ง ์์์ ๋ํ ์ดํด๋๊ฐ ๋ถ์กฑํ๋ฉด ๋ถ๋ช ํ ๋ง์ ์ค๋ฅ๋ฅผ ๋ง๋ฑ ๋จ๋ฆฌ๊ฒ ๋ ๊ฒ์ด๋ค.
ํ์๋ ๋ง์ฐฌ๊ฐ์ง์ธ ์ํฉ
DOM Access ๐
DOM์ผ๋ก์ ๋ค์ํ ์ ๊ทผ ๋ฐฉ๋ฒ์ ์ ๋ฆฌํ๊ณ ํ์ฉํ๋ ์๊ฐ์ ๊ฐ๋๋ค.
Document
์ง๊ธ ์๋ํ๊ณ ์๋ ์น ํ์ด์ง๋ document
๋ผ๋ ํ๋กํผํฐ๋ก ๋ถ๋ฌ์ฌ ์ ์๋ค.
HTML === document
๊ทธ๋ฌ๋, document
๋ผ๋ ํ๋กํผํฐ๋ ์์ผ๋ก DOM์ ์กฐ์ํ ๋ ๋ฌด์กฐ๊ฑด ์ฐ์ผ ๊ฒ์ด๋ค.
DOM Tree์ ์๋จ ๋ ธ๋๋ ์๋์ ๊ฐ์ด ๊ฐ์ ธ์ฌ ์ ์๋ค. (๋น์ฐํ ์๋จ ๋ ธ๋ ๋ฟ๋ง ์๋๋ผ ํ์ ๋ ธ๋๊น์ง ๋ค ๊ฐ์ ธ์จ๋ค.)
-
<html>
: document.documentElement -
<body>
: document.body -
<head>
: document.head
childNodes / firstChild / lastChild
child๋ ์์์ด๋ผ๋ ๋ป์ด๋ค. ๊ณ ๋ก ๋ด๊ฐ ์ ํํ Node์ ์์ ์์๋ฅผ ๊ฐ์ ธ์ค๊ณ ์ถ๋ค๋ฉด ์ด ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
childNodes
: ๋ด๊ฐ ์ ํํ ๋ ธ๋ ๋ค์ *.childNodes ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋ชจ๋ ์์ ๋ ธ๋๋ฅผ ํ์ธํ ์ ์๋ค. (๋ฐฐ์ด์ด ์๋ ์ดํฐ๋ฌ๋ธํ ์ ์ฌ ๋ฐฐ์ด ๊ฐ์ฒด์ธ ์ปฌ๋ ์ ์ผ๋ก ๋ฐํ๋๋ค.)firstChild
: ๋ด๊ฐ ์ ํํ ๋ ธ๋์ ์ฒซ ๋ฒ์งธ ์์ ๋ ธ๋๋ฅผ ๊ฐ์ ธ์จ๋ค.lastChild
: ๋ด๊ฐ ์ ํํ ๋ ธ๋์ ๋ง์ง๋ง ๋ฒ์งธ ์์ ๋ ธ๋๋ฅผ ๊ฐ์ ธ์จ๋ค.
nextSibling / previousSibling
sibling์ ํ์ /์๋งค๋ผ๋ ๋ป์ด๋ค. ๊ฐ์ indentation์ ๊ฐ๋ ๋ ธ๋๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค. (์ด๋ฏธ์ง ์ฌ๋ผ์ด๋ ๋ฑ์ ์์ฃผ ์ฐ์.)
nextSibling
: ๋ค์ ํ์ ์ธ ๋ ธ๋๋ฅผ ๋ฐํํ๋ค.(์๋์ชฝ ๋ ธ๋)previousSibling
: ์ด์ ํ์ ์ธ ๋ ธ๋๋ฅผ ๋ฐํํ๋ค.(์์ชฝ ๋ ธ๋)
parentNode
parent๋ ๋ถ๋ชจ๋ค. ํด๋น ๋ ธ๋์ ๋ถ๋ชจ ๋ ธ๋๋ฅผ ๊ฐ์ ธ์จ๋ค.
parentNode
: ๋ด๊ฐ ์ ํํ ๋ ธ๋์ ์ง๊ณ ๋ถ๋ชจ ๋ ธ๋๋ฅผ ๊ฐ์ ธ์จ๋ค.
getElement* / querySelector*
์์ ์์ ํ์ ๋ถ๋ชจ ์ฒ๋ผ ๊ทผ์ฒ์๋ง ์๋ ๋ ธ๋๋ง ํ์ํ ์ ์์๋ค๋ฉด, DOM ์กฐ์์ด ๊ต์ฅํ ๋ถํธํ๊ณ ๊น๋ค๋ก์ ์ ๊ฒ์ด๋ค.
DOM ์กฐ์์ ๊ฝ์ด๋ค.
Tag, Id, ํ๋๋ง ์ฐพ๊ธฐ ์ ๋ถ ์ฐพ๊ธฐ ๋ฑ๋ฑ ๋ง์ด ์์ง๋ง. ์์ฃผ ์ฐ์ด๋ ๋ฉ์๋๋ง ์ ๋ฆฌํ๊ฒ ๋ค.
getElementById
: ํด๋น ์์ด๋๋ก ์ง์ ํ tag๋ฅผ ๊ฐ์ ธ์จ๋ค.querySelector
: CSS Selector๋ฅผ ๋ชจ๋ ์ฌ์ฉํ ์ ์๋ ๋ฉ์๋์ด๋ค. ์ ํ๋ tag๋ฅผ ๊ฐ์ ธ์จ๋ค. (๊ฐ์ฅ ๋ง์ด์ฐ์ด๋ ๋ฏ ํ๋ค.)querySelectorAll
: CSS Selector๋ก ์ ํ๋ ๋ชจ๋ tag๋ค์ ๊ฐ์ ธ์จ๋ค.
nodeType / nodeName
node์ Type์ด๋ Name์ผ๋ก ๊ฐ์ ธ์จ Node์ ์ ๋ณด๋ฅผ ์ป์ ์ ์๋ค.
nodeType
: ์์๋ ธ๋, ์ฃผ์๋ ธ๋ ๋ฑ๋ฑ ๋ ธ๋์ ํ์ ์ ์๋ ค์ค๋ค.nodeName
: ๋ ธ๋์ ์ด๋ฆ์ ์๋ ค์ค๋ค. ex) DIV, UL ..
innerHTML / outerHTML
node์ HTML์์๋ฅผ ์ฝ์ด์ ๋ฐํํ๋ค.
<span class="text">Hi..</span>
์ ์์ ๋ฅผ ๊ฐ์ ธ์ ์๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด,
innerHTML
: Hi.. (์์ชฝ HTML์ ์ถ๋ ฅํ๋ค.)outerHTML
:<span class="text">Hi..</span>
(๋ฐ๊นฅ์ชฝ HTML๊น์ง ์ถ๋ ฅํ๋ค.)
createElement / createTextNode
์์๋ฅผ ๋ง๋๋ ๋ฉ์๋
createElement
: div, ul ๋ฑ๋ฑ ํ์ํ ํ๊ทธ๋ฅผ ๋์ ์ผ๋ก ๋ง๋ค ์ ์๋ค.createTextNode
: text node๋ฅผ ๋ง๋ค ์ ์๋ค.
Project ๋ด์ฉ
DOM์ ์ ๊ทผํ ์ ์๋ ๋ค์ํ ๋ฐฉ๋ฒ์ ํ์ฉํ์ฌ ๊ฐ๋จํ ํ๋ก์ ํธ๋ฅผ ์ ์ํ ๊ฒ์ด๋ค.
DOM์ ๋ํด ๊ณต๋ถํ๋ฉด์ ๋ค์ํ ๋ฉ์๋๋ค์ด ์๋ค๋ ๊ฒ์ ์์๋ค. (๋ชจ๋ฅด๋ฉด ์์ฐ๊ฒ ๋๋๋ผ..)
ํญ์ ๊ณต๋ถํ ๊ฒ๋ค์ ์ ๋ฆฌํ๊ณ ๊ธฐ๋กํด ๋๋ ๊ฒ๋ ์ค์ํ์ง๋ง, ๊ณผ๊ฑฐ์ ๊ทธ๋ ๊ฒ ๊ณต๋ถํ๋ ๊ฒ๋ค์ด ์ฌ์ค ๋จธ๋ฆฌ ์์ ์ ํํ ๋ฐํ์ง๋ ์์๋ ๊ฒ ๊ฐ๋ค.
๊ทธ๋์, ๊ณต๋ถํ ๊ฒ๋ค ๊ธฐ๋ฐ์ผ๋ก ๊ฐ๋จํ๊ฒ ํ๋ก์ ํธ๋ฅผ ๋ง๋ค๋ฉด์ ๊ฒช์ ์ํ์ฐฉ์ค๋ฅผ ๊ธฐ๋กํด ๋๋ ค๊ณ ํ๋ค.
์ด๋ฒ์ ๋ง๋ค ์๋น์ค๋ DOM Tree maker๋ผ๋ ์ด๋ฆ๋ง ๊ฑฐ์ฐฝํ ๋ณ๋ก ์ธ๋ชจ์๋ ํ๋ก์ ํธ์ด๋ค.
๊ธฐ๋ฅ ๊ตฌํ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ๋ค.
- HTML ์ฝ๋๋ฅผ Input Box์ ๋ฃ๋๋ค.
- ์ธ ๊ฐ์ง ๋ฒํผ ์ค ํ๋๋ฅผ ํด๋ฆญํ์ฌ Output Box์ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ค.
- Print Tree ๋ฒํผ: HTML์ฝ๋์ DOM Tree๋ฅผ ์ถ๋ ฅํ๋ค.(Body ๋ด๋ถ์ ๋ชจ๋ Node๋ค์ด indentation์ ๊ฐ๊ฒ ์ถ๋ ฅ)
- querySelector ๋ฒํผ: CSS Selector๋ฅผ ๋ฃ์ผ๋ฉด ์ ๋ ฅ๋ HTML ์ฝ๋์์ ๋ ธ๋๋ฅผ ์ถ์ถํ๋ค.
- getElementById ๋ฒํผ: id๋ฅผ ๋ฃ์ผ๋ฉด ์ ๋ ฅ๋ HTML ์ฝ๋์์ ๋ ธ๋๋ฅผ ์ถ์ถํ๋ค.
- ๋์ผ์.
DOM Tree maker Project ๐ฒ
์ํ์ฐฉ์ค
String to HTML
์ฌ์ฉ์์๊ฒ ์ ๋ ฅ๋ฐ๋ ๋ฌธ์์ด(String)์ HTML ํ์ฑํ๋ ๋ถ๋ถ์ด ๋ฌธ์ ์๋ค.
DOMParser ๋ผ๋ Web API๋ฅผ ์ฌ์ฉํ์ฌ string์ HTML๋ก ์ฝ๊ฒ ๋ณํํ ์ ์๋ค.(json->obj ๋ณํํ๋๊ฑฐ๋ ๋น์ทํ๋ค.)
const transformStrToHTML = (str) => { const parser = new DOMParser(); const doc = parser.parseFromString(str, "text/html"); return doc;};
DOM Tree ๊ทธ๋ฆฌ๊ธฐ(๋ ธ๋ ์๋ ๋ ธ๋ ์๋ ๋ ธ๋ ์๋ ....)
DOM Tree๋ฅผ ๊ทธ๋ฆด๋ 1์ต๊ฐ์ ์์์ ๊ฐ๋ ๋ ธ๋๋ฅผ ๋ง๋๋ฉด ๋ชจ๋ ์ถ๋ ฅํ ์ ์๊ฒ๋ ๋ก์ง์ ์ง์ผํ๋ค.
์ฌ๊ท ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋จํ๊ฒ ๊ตฌํํ๋ค.
๋ด๊ฐ Tree๋ฅผ ๊ตฌ์กฐํํ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ๋ค.
- body ์ดํ ์ฒซ ๋ฒ์งธ ๋ ธ๋๊ฐ ์ ํ๋๋ค.
- ol, li element๋ฅผ ๋ง๋ ๋ค.
- ๋ ธ๋์ ์ด๋ฆ์ผ๋ก text node๋ฅผ ๋ง๋ ๋ค.
- ol>li>textNode ์์๋ก ์กฐ๋ฆฝํ๋ค.
- ๋ ธ๋๊ฐ ์์ ๋ ธ๋๊ฐ ์๋ค๋ฉด(hasChildNodes() ๋ฉ์๋ ์ฌ์ฉ) ์ฌ๊ท
// searchNode functionconst searchNode = (nodes) => { const ol = document.createElement("ol");
for (let i = 0; i < nodes.length; i++) { const li = document.createElement("li"); const text = document.createTextNode("NODE NAME: " + nodes[i].nodeName); li.appendChild(text); ol.appendChild(li);
if (nodes[i].hasChildNodes()) { ol.append(searchNode(nodes[i].childNodes)); } }
return ol;};
HTML ๋ฌธ์์ด๋ก ๊ฐ์ ธ์ค๊ธฐ
querySelector๋ getElementById๋ก ๊ฐ์ ธ์ฌ ๋
innerHTML์ ์ฌ์ฉํ๊ฑฐ๋ ๊ทธ๋ฅ Object๋ฅผ Output์ ๋ฟ๋ ค์ฃผ๋ฉด ๊ฐ์ด ์ ๋๋ก ์ถ๋ ฅ๋์ง ์์๋ค.
outerHTML
์ ์ฌ์ฉํด์ ์ ํ๋ ์์๋ฅผ ๋ฌธ์์ด๋ก ์ถ๋ ฅํด์ฃผ์๋ค.
const printQuerySelector = (str) => { if (str === "") { alert("HTML์ ์
๋ ฅํด์ฃผ์ธ์~"); return; } const doc = transformStrToHTML(str); const inputQuery = document.querySelector(".selector"); const $result = document.querySelector(".result");
resetResult($result);
if (!inputQuery.value) { alert("CSS Selector๋ฅผ ์
๋ ฅํด์ฃผ์ธ์."); return; } const text = document.createTextNode( doc.querySelector(inputQuery.value).outerHTML );
$result.appendChild(text);};
๊ฒฐ๊ณผ
์ ํ์ตํ ์ ๋ณด๋ค๋ก ๋ง๋ค์ด๋ธ DOM tree maker project
์ ๋ด์ฉ๋ค์ ๋ฐํ์ผ๋ก ์์ฑ๋ ํ๋ก์ ํธ์ด๋ค. (Project ๋ฌธ์์ ์น ์๋น์ค ๋งํฌ๊ฐ ์๋ค.)
์คํ
