DOM
Last updated
์ฌํ์๋ณดํ์ ๋ณด์ฅ๋ช ๊ณผ ๋ณด์ฅ๊ฐ๊ฒฉ์ ๊ฐ์ ธ์ค๊ธฐ ์ํด ์นํฌ๋กค๋ง์ ํด๋ณด์๋ค. ์ฌ์ค ์ด ๊ณผ์ ์ ๊ทธ๋ฅ, html parsingํด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ html์์ ๋ด๊ฐ ์ํ๋ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ด ์ ๋ถ์๋ค. ์ํ๋ ๊ฒฐ๊ณผ๊ฐ ๋ฌด์์ธ์ง, ๋ด๊ฐ ๋ฌด์์ ํด์ผํ๋์ง๋ ๋ช ํํ์ง๋ง, ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ป๊ธฐ ์ํ ๊ณผ์ ์์ ์ด๋ ค์์ด ์์๋ค. Element, Node์ ๋ํ ์ฐจ์ด๋ฅผ ์ดํดํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ด๋ค.
๋ธ๋ผ์ฐ์ ์ DOM์ ๋ํด ๋ค์ ํ์ตํ๊ณ , Element์ Node์ ์ฐจ์ด๊ฐ ๋ฌด์์ธ์ง ์ ๋ฆฌํด๋ณด๊ณ ์ ํ๋ค. DOM์ด ๋ฌด์์ธ์ง์ ๋ํด ์ ๋ฆฌํ ๊ธ์ ์ฝ์ผ๋ฉฐ DOM์ ๋ํด ํ์ตํ์๋ค.
DOM์ Document Object Model์ ์ค์๋ง๋ฉฐ, ์นํ์ด์ง์ ๋ํ ์ธํฐํ์ด์ค๋ผ๊ณ ํ๋ค. DOM์ด ์ธํฐํ์ด์ค ์ด๋ฏ๋ก, ์ฐ๋ฆฌ๋ DOM์ ํตํด ์นํ์ด์ง์ ์ปจํ ์ธ , ๊ตฌ์กฐ, ์คํ์ผ์ ์ฝ๊ณ ์กฐ์ํ ์ ์๋ค.
๋ธ๋ผ์ฐ์ ๊ฐ HTML ํ์ผ์ ์ฝ์ด์์ ํ๋ฉด์ ๋์์ฃผ๋ ๊ณผ์ ์ 'critical rendering path'๋ผ๊ณ ๋ถ๋ฆฐ๋ค. ์ด ๊ณผ์ ์ ํฌ๊ฒ ๋ ๊ฐ์ง๋ก ๋๋์๋ฉด, (1) ๋ธ๋ผ์ฐ์ ๊ฐ HTML๊ณผ CSS๋ฅผ ํ์ฑํ์ฌ, ๊ฒฐ๊ตญ ํ๋ฉด์ ์ด๋ค ๊ฒ์ด ๋ณด์ฌ์ง๊ฒ ๋๋์ง๋ฅผ ๊ฒฐ์ ํ๋ ๊ณผ์ ๊ณผ (2) ๋ธ๋ผ์ฐ์ ๊ฐ ๋ ๋๋ง์ ํ๋ ๊ณผ์ ์ด๋ค.
(1)๋ฒ ๊ณผ์ ์ ๊ฑฐ์น๋ฉด, ๋ ๋ํธ๋ฆฌ๊ฐ ๋ง๋ค์ด์ง๋ค. ๋ ๋ํธ๋ฆฌ๋ ํ๋ฉด์ ๋ณด์ฌ์ง๊ฒ ๋๋ HTML element์ ๊ทธ์ ๋์ํ๋ ์คํ์ผ์ ํํํ ๊ฒ์ด๋ค. ๋ ๋ํธ๋ฆฌ๊ฐ ๋ง๋ค์ด์ง๊ธฐ ์ํด์๋ CSSOM(element์ ์ฐ๊ด๋ ์คํ์ผ์ด ํํ๋ Object Model)๊ณผ DOM(element๋ฅผ ํํํ๋ Object model)์ด ํ์ํ๋ค.
DOM์ HTML ๋ฌธ์๋ฅผ ๊ฐ์ฒด ๊ธฐ๋ฐ์ผ๋ก ํํํ ๊ฒ์ด๋ค. ์ ๊ฐ์ฒด๋ก ํํํ์๊น? ์ด๋ HTML์ ๊ตฌ์กฐ์ ๋ด์ฉ์ ๊ฐ์ฒด ๋ชจ๋ธ๋ก ๋ฐ๊ฟ์ ๋ค์ํ ํ๋ก๊ทธ๋จ์์ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๊ฒ ํ๊ธฐ ์ํจ์ด๋ค.
DOM์ ๊ฐ์ฒด ๊ตฌ์กฐ๋ **'๋
ธ๋ ํธ๋ฆฌ'**๋ผ๊ณ ๋ ๋ถ๋ฆฐ๋ค. ์๋ํ๋ฉด, DOM์ ๋ฃจํธ์์๋ถํฐ ์ฌ๋ฌ ๋
ธ๋๋ค์ด ๊ฐ์ง์น๋ฉฐ ๋์ค๋ ํธ๋ฆฌ๋ก ์๊ฐํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฃจํธ์ <html>
element๋ก ๋ถํฐ ์ค์ฒฉ๋ ์ฌ๋ฌ element๊ฐ ๋ป์ด๋์ค๊ฒ ๋๋ฉฐ, ๋ง๋จ ๋
ธ๋์๋ ๊ฐ element์ content๊ฐ ์๋ ํํ์ด๋ค.
๋ค์์ HTML ๋ฌธ์๋ ์๋์ ๊ฐ์ ๋ ธ๋ ํธ๋ฆฌ๋ก ํํ๋๋ค. html ํ๊ทธ๋ก๋ถํฐ, head, body node๊ฐ ๋์ค๊ฒ ๋๋ฉฐ, ํธ๋ฆฌ์ leaf์๋ ์ปจํ ์ธ ๋ค์ด ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
DOM์ด HTML ๋ฌธ์์ 1๋1๋ก ๋งคํ๋๋ ๊ฒ ์ฒ๋ผ ๋ณด์ด์ง๋ง, ์ข ๋ ์์ธํ ์์๋ณด๋ฉฐ ๊ทธ ์ฐจ์ด๋ฅผ ์ดํดํด์ผ ํ๋ค.
DOM์ด HTML ๋ฌธ์๋ก๋ถํฐ ๋ง๋ค์ด์ง๊ธด ํ์ง๋ง, ํญ์ ์ ํํ๊ฒ ๊ฐ์ง๋ ์๋ค.
(์ฐจ์ด์ 1) : HTML์ด ์ ํจํ์ง ์์ ๊ฒฝ์ฐ
DOM์ ์ค๋ก์ง ์ ํจํ HTML ๋ฌธ์์ ๋ํ ์ธํฐํ์ด์ค์ด๋ค. HTML์ ํ์ฑํ๋ฉฐ DOM์ ์์ฑํ๋ ๊ณผ์ ์์, ๋ธ๋ผ์ฐ์ ๋ HTML์์ ๋ฌธ์ ๊ฐ ์๋ ๊ฒ๋ค์ ๊ณ ์น ์๋ ์๋ค.
์๋ฅผ ๋ค์ด, ์๋์ HTML๊ณผ ๊ฐ์ด <head>
์ <body>
๊ฐ ๋น ์ง ์ ํจํ์ง ์์ HTML์ ๊ฒฝ์ฐ, DOM์ head์ body๋ฅผ ์ถ๊ฐํ์ฌ ์ ํจํ HTML๋ก ๊ณ ์น๊ฒ ๋๋ค.
(์ฐจ์ด์ 2) : DOM์ด ์๋ฐ์คํฌ๋ฆฝํธ์ ์ํด ์์ ๋์์ ๊ฒฝ์ฐ
DOM์ ์ ์ ์ธ ๊ฒ์ด ์๋๊ณ , ๋์ ์ผ๋ก ๋ณ๊ฒฝ๋ ์ ์๋ค. JS๊ฐ DOM์ ์์ ์ ๊ฐํ ์ ์๋๋ฐ, DOM์ ๋ ธ๋๋ฅผ ์ถ๊ฐํ๊ฑฐ๋, ์์ ํ๋ ๋ฑ์ ์์ ์ ํ ์ ์๋ค. ๊ทธ๋ฌ๋ JS๊ฐ DOM์ ๋ณ๊ฒฝํ๋ค๊ณ ํ์ฌ์ HTML์ด ๋ณ๊ฒฝ๋๋ ๊ฒ์ ์๋๋ค.
๋ธ๋ผ์ฐ์ ํ๋ฉด์์ ๋ณด์ฌ์ง๋ ๊ฒ์ ๋ ๋ํธ๋ฆฌ์ด๋ฉฐ, ๋ ๋ํธ๋ฆฌ๋ DOM๊ณผ CSSOM์ ํฉ์ณ์ ๊ตฌ์ฑํ๊ฒ ๋๋ค. DOM๊ณผ ๋ ๋ํธ๋ฆฌ์ ์ฐจ์ด๋ ๋ ๋ํธ๋ฆฌ๋ ํ๋ฉด์ ํ์ธํธ๋ ๊ฒ์ผ๋ก ๊ตฌ์ฑ๋์ด์๋ค๋ ๊ฒ์ด๋ค.
๋ ๋ํธ๋ฆฌ๋ ์ค๋ก์ง ๋ฌด์์ด ๋ ๋๋ง๋ ์ง์ ๋ํด ๊ด์ฌ์ ๊ฐ๊ธฐ ๋๋ฌธ์ ๋ณด์ฌ์ง์ง ์๋ ๋ถ๋ถ์ ๋ ๋ํธ๋ฆฌ์์ ์ ์ธ๊ฐ ๋๋ค. display: none
์์ฑ์ด ์๋ element๋ DOM์๋ ์์ง๋ง, ๋ณด์ฌ์ง์ง ์๊ธฐ ๋๋ฌธ์ ๋ ๋ํธ๋ฆฌ์๋ ๋น ์ง๋ค.
๋จ, visibility: hidden
์ ๋ง์ฐฌ๊ฐ์ง๋ก ํ๋ฉด์ ๋ณด์ด์ง๋ ์์ง๋ง, ๋ ๋ํธ๋ฆฌ์๋ ํฌํจ๋๋ค. ๋ฐ๋ผ์, visibility: hidden
์ผ๋ก ์จ๊ฒจ์ง element๋ ๋ณด์ด์ง๋ ์์ง๋ง, ์ค์ ํ๋ฉด์์ ๊ทธ ๊ณต๊ฐ์ ์ฐจ์งํ๊ณ ๋ ์๋ค.
devtool์ DOM์ ๊ฐ๊น์ด ๊ฒ์ ์ ๊ณตํ๋ค. ๊ทธ๋ฌ๋, ๋ฐ๋ธํด์ DOM์ ์๋๋ผ๋, ์ฐ๋ฆฌ์๊ฒ ์ ๋ณด๋ฅผ ์ฃผ๊ธฐ ์ํด ์ถ๊ฐ๋ก ๋ฃ๋ ๊ฒ๋ค์ด ์๋ค.
๊ทธ ์๋ก๋ CSS์ pseudo element๊ฐ ์๋ฐ. pseudo-element๋ CSSOM๊ณผ ๋ ๋ํธ๋ฆฌ๋ก๋ถํฐ ::before
์ ::after
์
๋ ํฐ๋ก ๋ง๋ค์ด์ง๊ฒ ๋๋ค. ๊ทธ๋ฌ๋, DOM์๋ ์ํ์ง ์๋๋ค. DOM์ HTML๋ก๋ถํฐ ๋ง๋ค์ด์ง๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, ๊ทธ Element์ ๊ด๋ จ๋ ์คํ์ผ์ ํฌํจํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค.
pseudo-element๊ฐ DOM์ ๊ตฌ์ฑ์ ์๋์ง๋ง, devtool์ ๊ทธ๊ฒ์ ๋ณด์ฌ์ฃผ๊ฒ ๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก, pseudo-element๊ฐ devtool์์ ๋ณด์ฌ์ง๋ค ํ๋๋ผ๋, JS๋ก ๊ทธ ์๋ฆฌ๋จผํธ๋ฅผ targetํ ์๋ ์๋ ๊ฒ์ด๋ค.
DOM์ Node์ ๊ณ์ธต ๊ตฌ์กฐ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. ๊ฐ ๋ ธ๋๋ ๋ถ๋ชจ์ children์ ๊ฐ์ง ์ ์๋ค.
์์ HTMl์ ์๋์ ์๋ ๋ ธ๋๋ค์ ๊ณ์ธต์ผ๋ก ๊ตฌ์ฑ๋์ด์๋ค.
HTML์ ์๋ tag (<html>
, <p>
์ ๊ฐ์...)๋ค์ node๋ฅผ ํํํ๊ฒ ๋๋ค. ์ฌ๊ธฐ์ ๊ทธ์ text์ด๋๋ผ๋ node๊ฐ ๋๋ค๋ ์ ์ด๋ค. ๋
ธ๋ํธ๋ฆฌ๋ฅผ ๋ณด๋ฉด, <p>
์์ ๋
ธ๋๋ก text node๊ฐ ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
Node Type
Node.ELEMENT_NODE ์ธ์๋, ์ฃผ์์ ํ์ ์ธ COMMENT_NODE์ ์ ์ฒด document tree๋ฅผ ํํํ๋ Node.DOCUMENT_NODE๋ ์๋ค.
Element๋ node์ ํน์ ํ์ ์ฆ, Node.ELEMENT_NODE์ธ ๊ฒ์ด๋ค.
element๋ HTML์์ ํ๊ทธ๋ก ์ ์ ๋
ธ๋๋ค์ ์ง์นญํ๋ค. ์๋ฅผ ๋ค์ด, <html>
, <div>
, <title>
๊ณผ ๊ฐ์ ํ๊ทธ๋ก ๋ํ๋ธ ๊ฒ๋ค์ ์ ๋ถ element์ธ ๊ฒ์ด๋ค. ์ฃผ์์ด๋ text node์ ๊ฐ์ ๊ฒ๋ค์ HTML ํ๊ทธ๋ก ํํ๋ ๊ฒ์ด ์๋๋ฏ๋ก element๊ฐ ์๋๋ค.
JS DOM์์Node
๋ node์ constructor์ด๊ณ , HTMLElement
๋ element์ constructor์ด๋ค.
paragraph๋ node์ด์ ๋์์ element์ด๋ค.
node์๋ง ์๋ DOM ํ๋กํผํฐ์ element์๋ง ์๋ DOM ํ๋กํผํฐ๋ฅผ ๊ตฌ๋ถํ ์ค ์์์ผ ํ๋ค.
๋ค์ Node์ ํ๋กํผํฐ๋ค์ node๋ NodeList๋ผ๊ณ ํ๋ค.
๋ค์ Node์ ํ๋กํผํฐ๋ค์ element๋ element์ ์งํฉ(HTMLCollection)์ด๋ค.
์ฌ๊ธฐ์ ์ฃผ๋ชฉํ ๊ฒ์ Node์ children์ ๊ฐ์ ธ์ค๋ ํ๋กํผํฐ๋ผ๋ ์ ์์๋ ๊ฐ์ง๋ง, NodeList ํํ๋ก ๊ฐ์ ธ์ค๋ node.childNodes
์ HTMLCollection ํํ๋ก ๊ฐ์ ธ์ค๋ node.children
์ด ์๋ค๋ ๊ฒ์ด๋ค.
์ ์ด ๋ ๊ฐ๋ฅผ ๋ง๋ค๊ฒ ๋์์ผ๋ฉฐ, ๊ทธ ์ฐจ์ด๋ ๋ฌด์์ผ๊น?
์์ ์๋ p tag๋ฅผ childNodes์ children์ผ๋ก ์ ๊ทผํ์์ ๋, ๊ทธ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๊ฒ ๋๋ค.
childNodes๋ก ์ ๊ทผํ๋ฉด HTMLElement์ Text๊ฐ ์๋ค. ์ด๋ p tag ์์ ์์๋
ธ๋๋ก ํ๊ทธ๊ฐ ์๋ element์ธ <b>Thank you</b>
์ text node์ธ for visiting my web page!
๊ฐ ์์์ ๋ํ๋ธ ๊ฒ์ด๋ค.
children์ผ๋ก ์ ๊ทผํ๋ฉด, ์ค๋ก์ง HTMLCollection ์ฆ element๋ง ๊ฐ์ ธ์ค๋ฏ๋ก text node์ธ for visiting my web page!
๋ ๋น ์ง๊ณ , element node์ธ <b>Thank you</b>
๋ง ๊ฐ์ ธ์ค๊ฒ ๋๋ค.
Element์ Node์ ์ฐจ์ด์ ์ ์ ์ดํดํ๊ณ , ์ ์ ํ ๋์ ์ ์ ํ ๊ฒ์ ์ ๊ทผํ๋ฉด ๋๋ ๊ฒ ๊ฐ๋ค. ์๋ฅผ ๋ค์๋ฉด, ํ์ฌ element์ parent๋ก ๋์ด๊ฐ์ sibling element์ ์ ๊ทผํด์ผ ํ๋ค. ์ด ๋, parentNode๋ก parent๋ฅผ ๊ฐ์ ธ์ค๋ ค๊ณ ํ์ ๋, ๋ด๊ฐ ์๋ํ ๋ฐ๋ฅผ ์ด๋ฃจ์ง ๋ชปํ์๋ค. element๋ก ๋์ด๊ฐ๋ ค๋ฉด parentElement๋ฅผ ํ์ด์ผ ํ๋๋ฐ, ๊ทธ๋ฌ์ง ๋ชปํ ๊ฒ์ด์๋ค. ์ด์ Node์ Element์ ์ฐจ์ด์ ์ ์์์ผ๋, ํ์ฑํ ๋๋ ๋ฐ๋๋ผ๋ก ํ์ ํ ์์ ์ข ๋ ์ฝ์ง์ ๋ ํ ์ ์์ ๊ฒ์ด๋ผ๊ณ ๋ฏฟ๋๋ค...
[What's the Difference between DOM Node and Element?