๐Ÿคทโ€โ™€๏ธ ๊ฐœ๋…๊ณต๋ถ€: 1. Javascript(DOM์ด๋ž€?)

Ko Seoyoungยท2021๋…„ 2์›” 9์ผ
0
post-thumbnail

DOM์ด ๋ญ˜๊นŒ?

<html>
    <head>
        <title>This is title</title>
    </head>
    <body>
        <h1>Lorem ipsum dolor sit amet
          consectetur adipisicing elit. 
            ...
          Explicabo unde blanditiis quam?</h1>
        <form action="">
            <button>Click Me</button>
        </form>
    </body>
</html>

DOM์€ Document Object Model(๋ฌธ์„œ๊ฐ์ฒด๋ชจ๋ธ)์˜ ์•ฝ์ž๋กœ HTML, XML ๋ฌธ์„œ์˜ ๊ฐ์ฒด๋ฅผ ๋‚˜ํƒ€๋‚ด๊ณ  ์ƒํ˜ธ์ž‘์šฉํ•˜๊ธฐ ์œ„ํ•œ API์ด๋‹ค.

DOM์€ ๋ฌธ์„œ์˜ ๊ตฌ์กฐํ™”๋œ ํ‘œํ˜„(structured representation)์„ ์ œ๊ณตํ•œ๋‹ค. DOM์€ ๋ฌธ์„œ๋ฅผ ๋…ผ๋ฆฌ ํŠธ๋ฆฌ๋กœ ํ‘œํ˜„ํ•˜๊ณ  ๊ฐ ๋…ธ๋“œ๋Š” ๊ฐ์ฒด๋ฅผ ๊ฐ–๋Š”๋‹ค.

๋˜, getElementById(), createElement(), style object ๋“ฑ์˜ API๋ฅผ ์ œ๊ณตํ•จ์œผ๋กœ์จ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ ๊ฐ™์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๊ฐ€ DOM ๊ตฌ์กฐ์— ์ ‘๊ทผํ•˜์—ฌ ๊ทธ๋“ค์ด ๋ฌธ์„œ ๊ตฌ์กฐ, element์˜ ์Šคํƒ€์ผ, ๋‚ด์šฉ ๋“ฑ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋•๋Š”๋‹ค.
(๊ณต๋ถ€๋ฅผ ํ•˜๊ธฐ ์ „์—๋Š” getElementById()์™€ ๊ฐ™์€ ํ•จ์ˆ˜๋“ค์ด ๋ชจ๋‘ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ•จ์ˆ˜์ธ์ค„ ์•Œ์•˜๋‹ค...๐Ÿ˜…)

DOM ์€ ๊ตฌ์กฐํ™”๋œ nodes์™€ property ์™€ method ๋ฅผ ๊ฐ–๊ณ  ์žˆ๋Š” objects๋กœ ๋ฌธ์„œ๋ฅผ ํ‘œํ˜„ํ•œ๋‹ค. ์ด๋“ค์€ ์›น ํŽ˜์ด์ง€๋ฅผ ์Šคํฌ๋ฆฝํŠธ ๋˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋“ค์—์„œ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๊ฒŒ ์—ฐ๊ฒฐ์‹œ์ผœ์ฃผ๋Š” ์—ญํ• ์„ ๋‹ด๋‹นํ•œ๋‹ค.

์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” ๋ฌธ์„œ์ธ Document๋Š” ์›นํŽ˜์ด์ง€๋ฅผ ๋งํ•œ๋‹ค. ์ด ๋ฌธ์„œ๋Š” ์›น ๋ธŒ๋ผ์šฐ์ €๋ฅผ ํ†ตํ•ด ๋‚ด์šฉ์ด ํ•ด์„๋˜๊ณ , ์›น ๋ธŒ๋ผ์šฐ์ € ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚˜๊ฑฐ๋‚˜ HTML ์†Œ์Šค ์ž์ฒด๋กœ ๋‚˜ํƒ€๋‚œ๋‹ค. ๋ฌธ์„œ์˜ ๋ชจ๋“  element์ธ html, body, title, head, button ๊ณผ ๊ฐ™์€ ํƒœ๊ทธ๋“ค์€ ๋ฌธ์„œ๋ฅผ ์œ„ํ•œ document object model ์˜ ํ•œ ๋ถ€๋ถ„์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.


๐Ÿ‘‡ ๋ฌธ์„œ์™€ ๋ฌธ์„œ์˜ ์š”์†Œ์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด DOM์ด ์‚ฌ์šฉ๋œ ์˜ˆ:

var paragraphs = document.getElementsByTagName("P");
// paragraphs[0] is the first <p> element
// paragraphs[1] is the second <p> element, etc.
alert(paragraphs[0].nodeName);

HTML DOM method ์ค‘ ํ•˜๋‚˜์ธ getElementsByTagName()
์ด๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€๋Š” ๋…๋ฆฝ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ํŒŒ์ด์ฌ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ๋„ ์žˆ๋‹ค.

๐Ÿ‘‡ ํŒŒ์ด์ฌ์—์„œ getElementsByTagName()๊ฐ€ ์‚ฌ์šฉ๋œ ์˜ˆ:

# Python DOM example
import xml.dom.minidom as m
doc = m.parse("C:\\Projects\\Py\\chap1.xml");
doc.nodeName # DOM property of document object;
p_list = doc.getElementsByTagName("para");

๐Ÿ‘‰ HTML DOM์ด๋ž€?

์›น ๋งˆํฌ์—… ์–ธ์–ด์ธ HTML์€ DOM ์ฝ”์–ด์— ์ •์˜๋œ ์ถ”์ƒํ™” ๊ฐœ๋…์— ์—˜๋ฆฌ๋จผํŠธ์˜ ์˜๋ฏธ๋ฅผ ๋”ํ•œ ๋ ˆ์ด์–ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค. HTML DOM์€ HTML ์—˜๋ฆฌ๋จผํŠธ์˜ className ๊ฐ™์€ ์†์„ฑ๊ณผ document.body ๊ฐ™์€ API๋„ ํฌํ•จํ•œ๋‹ค.
ex) HTML DOM Anchor Object: HTML์—์„œ <a> element๋กœ ํ‘œํ˜„๋˜๋Š” Anchor ๊ฐ์ฒด


DOM๊ณผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ

DOM ์€ ์›น ํŽ˜์ด์ง€์˜ ๊ฐ์ฒด ์ง€ํ–ฅ ํ‘œํ˜„์ด๋ฉฐ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ ๊ฐ™์€ ์Šคํฌ๋ฆฝํŒ… ์–ธ์–ด๋ฅผ ์ด์šฉํ•ด DOM ์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. DOM ์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋Š” ์•„๋‹ˆ์ง€๋งŒ DOM ์ด ์—†๋‹ค๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด๋Š” ์›น ํŽ˜์ด์ง€ ๋˜๋Š” XML ํŽ˜์ด์ง€ ๋ฐ ์š”์†Œ๋“ค๊ณผ ๊ด€๋ จ๋œ ๋ชจ๋ธ์ด๋‚˜ ๊ฐœ๋…๋“ค์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ–์ง€ ๋ชปํ•˜๊ฒŒ ๋œ๋‹ค.

์ดˆ์ฐฝ๊ธฐ์—๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ DOM ๊ฐ€ ๋ฐ€์ ‘ํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์—ˆ์ง€๋งŒ, ๋‚˜์ค‘์—๋Š” ๊ฐ๊ฐ ๋ถ„๋ฆฌ๋˜์–ด ๋ฐœ์ „ํ•ด์™”๋‹ค. ํŽ˜์ด์ง€ ์ฝ˜ํ…์ธ (the page content)๋Š” DOM ์— ์ €์žฅ๋˜๊ณ  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๊ฒƒ์„ ๋ฐฉ์ •์‹์œผ๋กœ ํ‘œํ˜„ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค:

API (web or XML page) = DOM + JS (scripting language)

DOM ์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•?

์›น๋ธŒ๋ผ์šฐ์ €์—์„œ HTMLํŒŒ์ผ์„ ๋ฐ›์•„ DOM์œผ๋กœ ๋งŒ๋“ค๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์กฐ์ž‘์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค! (๋ชจ๋“  DOM์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๋•Œ: ๋ฌธ์„œ๊ฐ€ ๋กœ๋“œ๋  ๋•Œ!)

์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ(์ธ๋ผ์ธ <script> ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์›น ํŽ˜์ด์ง€ ์•ˆ์— ์žˆ๋Š” ์Šคํฌ๋ฆฝํŠธ ๋กœ๋”ฉ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ), ๋ฌธ์„œ ์ž์ฒด๋ฅผ ์กฐ์ž‘ํ•˜๊ฑฐ๋‚˜ ๋ฌธ์„œ์˜ children ์„ ์–ป๊ธฐ ์œ„ํ•ด document ๋˜๋Š” window elements ๋ฅผ ์œ„ํ•œ API ๋ฅผ ์ฆ‰์‹œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.


[๋ถ€๋ก] Node, Document, Element ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•ด

๊ณต๋ถ€๋ฅผ ํ•˜๋‹ค๋ณด๋‹ˆ doucment๋Š” ์ •ํ™•ํžˆ ๋ฌด์—‡์ด๊ณ , element์™€ node๋Š” ๋ฌด์Šจ์ฐจ์ด๊ฐ€ ์žˆ๋Š”์ง€ ์ž˜์ดํ•ด๊ฐ€ ์•ˆ ๊ฐ€ ๋จธ๋ฆฟ์†์ด ๋ณต์žกํ–ˆ๋‹ค.

๋‹คํ–‰ํžˆ๋„ MDN Web Docs์— ๊ฐœ๋…์ด ์ž˜ ์ •๋ฆฌ๊ฐ€ ๋˜์–ด์žˆ์–ด์„œ ์ด์ œ ์ดํ•ด๊ฐ€ ๋˜์—ˆ๋‹ค!


Node : ์—ฌ๋Ÿฌ ๊ฐ€์ง€ DOM ํƒ€์ž…๋“ค์ด ์ƒ์†ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ด๋ฉฐ ๊ทธ ๋‹ค์–‘ํ•œ ํƒ€์ž…๋“ค์„ ๋น„์Šทํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

  • DOM์€ ํŠธ๋ฆฌ ๊ตฌ์กฐ ์ด๊ธฐ ๋•Œ๋ฌธ์—, ์ด ๋•Œ Node๋Š” Node.childNodes, Node.firstChild, Node.lastChild, Node.parentNode๋‚˜ Node.appendChild(), Node.hasChildNodes() ์™€ ๊ฐ™์ด ํŠธ๋ฆฌ ๊ตฌ์กฐ์™€ ๊ด€๋ จ๋œ ์†์„ฑ์ด๋‚˜ ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
  • Document, Element์˜ ๋ถ€๋ชจ ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค.

Document : ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ถˆ๋Ÿฌ์˜จ ์›น ํŽ˜์ด์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ ํŽ˜์ด์ง€ ์ฝ˜ํ…์ธ (DOM ํŠธ๋ฆฌ)์˜ ์ง„์ž…์  ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. (DOM ํŠธ๋ฆฌ๋Š” <body>์™€ <table> ๋ฐ ์—ฌ๋Ÿฌ ๋‹ค๋ฅธ ์š”์†Œ๋ฅผ ํฌํ•จํ•œ๋‹ค.)

  • Document๋Š” ํŽ˜์ด์ง€์˜ URL์„ ์–ป๊ฑฐ๋‚˜ ๋ฌธ์„œ์— ์ƒˆ๋กœ์šด ์š”์†Œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ์ „์—ญ์ ์œผ๋กœ ์ œ๊ณตํ•œ๋‹ค.
  • Document ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋ชจ๋“  ์ข…๋ฅ˜์˜ ๋ฌธ์„œ์— ๋Œ€ํ•œ ๊ณตํ†ต์˜ ์†์„ฑ๊ณผ ๋ฉ”์„œ๋“œ๋ฅผ ๋ฌ˜์‚ฌํ•˜๊ณ , ๋ฌธ์„œ์˜ ์œ ํ˜•(HTML, XML, SVG ๋“ฑ)์— ๋”ฐ๋ผ HTMLDocument ์ธํ„ฐํŽ˜์ด์Šค, XMLDocument ์ธํ„ฐํŽ˜์ด์Šค ๋“ฑ ๋” ๋‹ค์–‘ํ•œ API๊ฐ€ ์กด์žฌํ•œ๋‹ค.
  • HTML ๋ฌธ์„œ๋ฅผ ์œ„ํ•œ Document ์ธํ„ฐํŽ˜์ด์Šค์ธ HTMLDocument๋Š” Document.cookie, Document.URL, document.getElementsByName(), document.write() ๋“ฑ์˜ ์†์„ฑ๊ณผ ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

Element : Document ์•ˆ์˜ ๋ชจ๋“  ๊ฐ์ฒด๊ฐ€ ์ƒ์†ํ•˜๋Š” ์ œ์ผ ๋ฒ”์šฉ์ ์ธ ๊ธฐ๋ฐ˜ ํด๋ž˜์Šค๋กœ ๊ณตํ†ต ๋ฉ”์„œ๋“œ์™€ ์†์„ฑ๋งŒ ๊ฐ–๋Š”๋‹ค.

  • Node์™€ ๊ทธ ๋ถ€๋ชจ์ธ EventTarget์„ ์ƒ์†๋ฐ›๋Š”๋‹ค
  • HTMLElement ์ธํ„ฐํŽ˜์ด์Šค -HTML ์š”์†Œ์˜ ๊ธฐ๋ฐ˜ ์ธํ„ฐํŽ˜์ด์Šค
    SVGElement ์ธํ„ฐํŽ˜์ด์Šค - ๋ชจ๋“  SVG ์š”์†Œ์˜ ๊ธฐ์ดˆ
  • Element.attributes,Element.className, Element.innerHTML์™€ Element.querySelector(), Element.querySelectorAll(), Element.getElementsByClassName()์™€ ๊ฐ™์€ ์†์„ฑ๊ณผ ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

EventTarget: ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ์ˆ˜์‹ ๊ธฐ(listener)๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด๊ฐ€ ๊ตฌํ˜„ํ•˜๋Š” DOM ์ธํ„ฐํŽ˜์ด์Šค

  • EventTarget.addEventListener(), EventTarget.addEventListener() ๋“ฑ์˜ ๋ฉ”์†Œ๋“œ ์ œ๊ณต
  • Node๊ฐ€ ์ด๋ฅผ ์ƒ์†๋ฐ›์Œ์œผ๋กœ์จ document์™€ element ๋“ฑ์—์„œ ํ•ด๋‹น ๋ฉ”์†Œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Refs

DOM์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

DOM ์†Œ๊ฐœ


profile
Web Frontend Developer ๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป #React #Nextjs #ApolloClient

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