๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • What would life be If we had no courage to attemp anything?
Language/JavaScript

JavaScript - DOM(Document Object Model)

by DevIseo 2022. 5. 3.

|DOM ์กฐ์ž‘ - ๊ฐœ๋…

  • Document๋Š” ๋ฌธ์„œ ํ•œ์žฅ(HTML)์— ํ•ด๋‹นํ•˜๊ณ  ์ด๋ฅผ ์กฐ์ž‘
  • DOM ์กฐ์ž‘ ์ˆœ์„œ
    • ์„ ํƒ(Select)
    • ๋ณ€๊ฒฝ(Mainpulation)

 

|DOM ๊ด€๋ จ ๊ฐ์ฒด์˜ ์ƒ์† ๊ตฌ์กฐ

  • Event Target
    • Event Listner๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด๊ฐ€ ๊ตฌํ˜„ํ•˜๋Š” DOM ์ธํ„ฐํŽ˜์ด์Šค
  • Node
    • ์—ฌ๋Ÿฌ ๊ฐ€์ง€ DOM ํƒ€์ž…๋“ค์ด ์ƒ์†ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค

  • Element
    • Document ์•ˆ์˜ ๋ชจ๋“  ๊ฐ์ฒด๊ฐ€ ์ƒ์†ํ•˜๋Š” ๊ฐ€์žฅ ๋ฒ”์šฉ์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค
    • ๋ถ€๋ชจ์ธ Node์™€ ๊ทธ ๋ถ€๋ชจ์ธ EventTarget์˜ ์†์„ฑ์„ ์ƒ์†
  • Document
    • ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ถˆ๋Ÿฌ์˜จ ์›น ํŽ˜์ด์ง€๋ฅผ ๋‚˜ํƒ€๋ƒ„
    • DOM ํŠธ๋ฆฌ์˜ ์ง„์ž…์ (entry point) ์—ญํ• ์„ ์ˆ˜ํ–‰
  • HTMLElement
    • ๋ชจ๋“  ์ข…๋ฅ˜์˜ HTML ์š”์†Œ
    • ๋ถ€๋ชจ element์˜ ์†์„ฑ ์ƒ์†

 

|DOM ์„ ํƒ โ€“ ์„ ํƒ ๊ด€๋ จ ๋ฉ”์„œ๋“œ

  • document.querySelector(selector)
    • ์ œ๊ณตํ•œ ์„ ํƒ์ž์™€ ์ผ์น˜ํ•˜๋Š” element ํ•˜๋‚˜ ์„ ํƒ
    • ์ œ๊ณตํ•œ CSS selector๋ฅผ ๋งŒ์กฑํ•˜๋Š” ์ฒซ ๋ฒˆ์งธ element ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ (์—†๋‹ค๋ฉด null)
  • document.querySelectorAll(selector)
    • ์ œ๊ณตํ•œ ์„ ํƒ์ž์™€ ์ผ์น˜ํ•˜๋Š” ์—ฌ๋Ÿฌ element๋ฅผ ์„ ํƒ
    • ๋งค์นญ ํ•  ํ•˜๋‚˜ ์ด์ƒ์˜ ์…€๋ ‰ํ„ฐ๋ฅผ ํฌํ•จํ•˜๋Š” ์œ ํšจํ•œ CSS selector๋ฅผ ์ธ์ž(๋ฌธ์ž์—ด)๋กœ ๋ฐ›์Œ
    • ์ง€์ •๋œ ์…€๋ ‰ํ„ฐ์— ์ผ์น˜ํ•˜๋Š” NodeList๋ฅผ ๋ฐ˜ํ™˜
    โ€ข querySelector(), querySelectorAll()์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 
    โ€ข id, class ๊ทธ๋ฆฌ๊ณ  tag ์„ ํƒ์ž ๋“ฑ์„ ๋ชจ๋‘ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ, ๋” ๊ตฌ์ฒด์ ์ด๊ณ  ์œ ์—ฐํ•˜๊ฒŒ ์„ ํƒ ๊ฐ€๋Šฅ
    ex) document.querySelector('#idโ€™), document.querySelectAll(โ€˜.class')
    

|DOM ์„ ํƒ - ์„ ํƒ ๋ฉ”์„œ๋“œ๋ณ„ ๋ฐ˜ํ™˜ ํƒ€์ž…

  1. ๋‹จ์ผ element โ€ข getElementById() โ€ข querySelector()
  2. HTMLCollection โ€ข getElementsByTagName() โ€ข getElementsByClassName()
  3. NodeList โ€ข querySelectorAll()

 

|DOM ์„ ํƒ - HTMLCollection & NodeList

  • ๋‘˜ ๋‹ค ๋ฐฐ์—ด๊ณผ ๊ฐ™์ด ๊ฐ ํ•ญ๋ชฉ์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ index๋ฅผ ์ œ๊ณต (์œ ์‚ฌ ๋ฐฐ์—ด)
  • HTMLCollection
    • name, id, index ์†์„ฑ์œผ๋กœ ๊ฐ ํ•ญ๋ชฉ์— ์ ‘๊ทผ ๊ฐ€๋Šฅ
  • NodeList
    • index๋กœ๋งŒ ๊ฐ ํ•ญ๋ชฉ์— ์ ‘๊ทผ ๊ฐ€๋Šฅ
    • ๋‹จ, HTMLCollection๊ณผ ๋‹ฌ๋ฆฌ ๋ฐฐ์—ด์—์„œ ์‚ฌ์šฉํ•˜๋Š” forEach ๋ฉ”์„œ๋“œ ๋ฐ ๋‹ค์–‘ํ•œ ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ๋‘˜ ๋‹ค Live Collection์œผ๋กœ DOM์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ˜์˜ํ•˜์ง€๋งŒ, querySelectorAll()์— ์˜ํ•ด ๋ฐ˜ํ™˜๋˜๋Š” NodeList๋Š” Static Collection์œผ๋กœ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ˜์˜๋˜์ง€ ์•Š์Œ

 

|DOM ์„ ํƒ - Collection

  • Live Collection
    • ๋ฌธ์„œ๊ฐ€ ๋ฐ”๋€” ๋•Œ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์—…๋ฐ์ดํŠธ ๋จ
    • DOM์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ collection์— ๋ฐ˜์˜
    • ex) HTMLCollection, NodeList
  • Static Collection (non-live)
    • DOM์ด ๋ณ€๊ฒฝ๋˜์–ด๋„ collection ๋‚ด์šฉ์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Œ
    • querySelectorAll()์˜ ๋ฐ˜ํ™˜ NodeList๋งŒ static collection

 

|DOM ๋ณ€๊ฒฝ - ๋ณ€๊ฒฝ ๊ด€๋ จ ๋ฉ”์„œ๋“œ (Creation), (append DOM)

  • document.createElement()
    • ์ž‘์„ฑํ•œ ํƒœ๊ทธ ๋ช…์˜ HTML ์š”์†Œ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ฐ˜ํ™˜

  • Element.append()
    • ํŠน์ • ๋ถ€๋ชจ Node์˜ ์ž์‹ NodeList ์ค‘ ๋งˆ์ง€๋ง‰ ์ž์‹ ๋‹ค์Œ์— Node ๊ฐ์ฒด๋‚˜ DOMString์„ ์‚ฝ์ž…
    • ์—ฌ๋Ÿฌ ๊ฐœ์˜ Node ๊ฐ์ฒด, DOMString์„ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Œ
    • ๋ฐ˜ํ™˜ ๊ฐ’์ด ์—†์Œ
  • Node.appendChild()
    • ํ•œ Node๋ฅผ ํŠน์ • ๋ถ€๋ชจ Node์˜ ์ž์‹ NodeList ์ค‘ ๋งˆ์ง€๋ง‰ ์ž์‹์œผ๋กœ ์‚ฝ์ž… (Node๋งŒ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ)
    • ํ•œ๋ฒˆ์— ์˜ค์ง ํ•˜๋‚˜์˜ Node๋งŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Œ
    • ๋งŒ์•ฝ ์ฃผ์–ด์ง„ Node๊ฐ€ ์ด๋ฏธ ๋ฌธ์„œ์— ์กด์žฌํ•˜๋Š” ๋‹ค๋ฅธ Node๋ฅผ ์ฐธ์กฐํ•œ๋‹ค๋ฉด ์ƒˆ๋กœ์šด ์œ„์น˜๋กœ ์ด๋™

 

|ParentNode.append() vs Node.appendChild()

  • append()๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด DOMString ๊ฐ์ฒด๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, .appendChild()๋Š” Node ๊ฐ์ฒด๋งŒ ํ—ˆ์šฉ
  • append()๋Š” ๋ฐ˜ํ™˜ ๊ฐ’์ด ์—†์ง€๋งŒ, appendChild()๋Š” ์ถ”๊ฐ€๋œ Node ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜
  • append()๋Š” ์—ฌ๋Ÿฌ Node ๊ฐ์ฒด์™€ ๋ฌธ์ž์—ด์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, .appendChild()๋Š” ํ•˜๋‚˜์˜ Node ๊ฐ์ฒด๋งŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Œ

 

|DOM ๋ณ€๊ฒฝ โ€“ ๋ณ€๊ฒฝ ๊ด€๋ จ ์†์„ฑ (property)

  • Node.innerText
    • Node ๊ฐ์ฒด์™€ ๊ทธ ์ž์†์˜ ํ…์ŠคํŠธ ์ปจํ…์ธ (DOMString)๋ฅผ ํ‘œํ˜„ (ํ•ด๋‹น ์š”์†Œ ๋‚ด๋ถ€์˜ raw text) (์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ์š”์†Œ๋งŒ ๋‚จ๊น€)
    • ์ฆ‰, ์ค„ ๋ฐ”๊ฟˆ์„ ์ธ์‹ํ•˜๊ณ  ์ˆจ๊ฒจ์ง„ ๋‚ด์šฉ์„ ๋ฌด์‹œํ•˜๋Š” ๋“ฑ ์ตœ์ข…์ ์œผ๋กœ ์Šคํƒ€์ผ๋ง์ด ์ ์šฉ๋œ ๋ชจ์Šต์œผ๋กœ ํ‘œํ˜„
  • Element.innerHTML
    • ์š”์†Œ(element) ๋‚ด์— ํฌํ•จ๋œ HTML ๋งˆํฌ์—…์„ ๋ฐ˜ํ™˜
    • [์ฐธ๊ณ ] XSS ๊ณต๊ฒฉ์— ์ทจ์•ฝํ•˜๋ฏ€๋กœ ์‚ฌ์šฉ ์‹œ ์ฃผ์˜

 

|XSS (Cross-site Scripting)

  • ๊ณต๊ฒฉ์ž๊ฐ€ ์ž…๋ ฅ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ(<input>)์›น ์‚ฌ์ดํŠธ ํด๋ผ์ด์–ธํŠธ ์ธก ์ฝ”๋“œ์— ์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•ด ๊ณต๊ฒฉํ•˜๋Š” ๋ฐฉ๋ฒ•
  • ํ”ผํ•ด์ž(์‚ฌ์šฉ์ž)์˜ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋ฉฐ ๊ณต๊ฒฉ์ž๊ฐ€ ์—‘์„ธ์Šค ์ œ์–ด๋ฅผ ์šฐํšŒํ•˜๊ณ  ์‚ฌ์šฉ์ž๋ฅผ ๊ฐ€์žฅ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ

 

|DOM ์‚ญ์ œ - ์‚ญ์ œ ๊ด€๋ จ ๋ฉ”์„œ๋“œ

  • ChildNode.remove()
    • Node๊ฐ€ ์†ํ•œ ํŠธ๋ฆฌ์—์„œ ํ•ด๋‹น Node๋ฅผ ์ œ๊ฑฐ
  • Node.removeChild()
    • DOM์—์„œ ์ž์‹ Node๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์ œ๊ฑฐ๋œ Node๋ฅผ ๋ฐ˜ํ™˜
    • Node๋Š” ์ธ์ž๋กœ ๋“ค์–ด๊ฐ€๋Š” ์ž์‹ Node์˜ ๋ถ€๋ชจ Node

 

|DOM ์†์„ฑ โ€“ ์†์„ฑ ๊ด€๋ จ ๋ฉ”์„œ๋“œ

  • Element.setAttribute(name, value)
    • ์ง€์ •๋œ ์š”์†Œ์˜ ๊ฐ’์„ ์„ค์ •
    • ์†์„ฑ์ด ์ด๋ฏธ ์กด์žฌํ•˜๋ฉด ๊ฐ’์„ ๊ฐฑ์‹ , ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ์ง€์ •๋œ ์ด๋ฆ„๊ณผ ๊ฐ’์œผ๋กœ ์ƒˆ ์†์„ฑ์„ ์ถ”๊ฐ€
  • Element.getAttribute(attributeName)
    • ํ•ด๋‹น ์š”์†Œ์˜ ์ง€์ •๋œ ๊ฐ’(๋ฌธ์ž์—ด)์„ ๋ฐ˜ํ™˜
    • ์ธ์ž(attributeName)๋Š” ๊ฐ’์„ ์–ป๊ณ ์ž ํ•˜๋Š” ์†์„ฑ์˜ ์ด๋ฆ„

 

<DOM ์กฐ์ž‘ Summary>

1. ์„ ํƒํ•œ๋‹ค.

querySelector() querySelectorAll() ...

2. ๋ณ€๊ฒฝ(์กฐ์ž‘)ํ•œ๋‹ค.

innerText innerHTML element.style.color setAttribute() getAttribute() createElement() appendChild() ...

๋Œ“๊ธ€