๊ด€๋ฆฌ ๋ฉ”๋‰ด

Daehyunii's Dev-blog

39์žฅ DOM(๋…ธ๋“œ๋“ค๋กœ ๊ตฌ์„ฑ๋œ ํŠธ๋ฆฌ ์ž๋ฃŒ๊ตฌ์กฐ) ๋ณธ๋ฌธ

๐Ÿ“š Language & CS knowledge/JavaScript (๋ชจ๋˜์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Deep Dive)

39์žฅ DOM(๋…ธ๋“œ๋“ค๋กœ ๊ตฌ์„ฑ๋œ ํŠธ๋ฆฌ ์ž๋ฃŒ๊ตฌ์กฐ)

Daehyunii 2022. 7. 28. 17:44

  ๋ธŒ๋ผ์šฐ์ €์˜ ๋ Œ๋”๋ง ์—”์ง„์€ HTML ๋ฌธ์„œ๋ฅผ ํŒŒ์‹ฑํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ธ DOM์„ ์ƒ์„ฑํ•œ๋‹ค. DOM์€ HTML ๋ฌธ์„œ์˜ ๊ณ„์ธต์  ๊ตฌ์กฐ์™€ ์ •๋ณด๋ฅผ ํ‘œํ˜„ํ•˜๋ฉฐ ์ด๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” API, ์ฆ‰ ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•˜๋Š” ํŠธ๋ฆฌ ์ž๋ฃŒ๊ตฌ์กฐ๋‹ค.

 

39.1 ๋…ธ๋“œ

39.1.1 HTML ์š”์†Œ์™€ ๋…ธ๋“œ ๊ฐ์ฒด

  HTML ์š”์†Œ๋Š” HTML ๋ฌธ์„œ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฐœ๋ณ„์ ์ธ ์š”์†Œ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. HTML ์š”์†Œ๋Š” ๋ Œ๋”๋ง ์—”์ง„์— ์˜ํ•ด ํŒŒ์‹ฑ๋˜์–ด DOM์„ ๊ตฌ์„ฑํ•˜๋Š” ์š”์†Œ ๋…ธ๋“œ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜๋œ๋‹ค. ์ด๋•Œ HTML ์š”์†Œ์˜ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๋…ธ๋“œ๋กœ, HTML ์š”์†Œ์˜ ํ…์ŠคํŠธ ์ปจํ…์ธ ๋Š” ํ…์ŠคํŠธ ๋…ธ๋“œ๋กœ ๋ณ€ํ™˜๋œ๋‹ค.

 

<div(์‹œ์ž‘ํƒœ๊ทธ) class(์–ดํŠธ๋ฆฌ๋ทฐํŠธ ์ด๋ฆ„) = "greeting"(์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๊ฐ’)>Hello(์ฝ˜ํ…์ธ )</div>(์ข…๋ฃŒํƒœ๊ทธ)

 

  HTML ๋ฌธ์„œ๋Š” HTML ์š”์†Œ๋“ค์˜ ์ง‘ํ•ฉ์œผ๋กœ ์ด๋ค„์ง€๋ฉฐ, HTML ์š”์†Œ๋Š” ์ค‘์ฒฉ ๊ด€๊ณ„๋ฅผ ๊ฐ–๋Š”๋‹ค. ์ฆ‰, HTML ์š”์†Œ์˜ ์ฝ˜ํ…์ธ  ์˜์—ญ์—๋Š” ํ…์ŠคํŠธ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ HTML ์š”์†Œ๋„ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ HTML ์š”์†Œ ๊ฐ„์—๋Š” ์ค‘์ฒฉ ๊ด€๊ณ„์— ์˜ํ•ด ๊ณ„์ธต์ ์ธ ๋ถ€์ž๊ด€๊ณ„๊ฐ€ ํ˜•์„ฑ๋œ๋‹ค. ์ด๋Ÿฌํ•œ HTML ์š”์†Œ๊ฐ„์˜ ๋ถ€์ž ๊ด€๊ณ„๋ฅผ ๋ฐ˜์˜ํ•˜์—ฌ HTML ๋ฌธ์„œ์˜ ๊ตฌ์„ฑ ์š”์†Œ์ธ HTML ์š”์†Œ๋ฅผ ๊ฐ์ฒดํ™”ํ•œ ๋ชจ๋“  ๋…ธ๋“œ ๊ฐ์ฒด๋“ค์„ ํŠธ๋ฆฌ ์ž๋ฃŒ ๊ตฌ์กฐ๋กœ ๊ตฌ์„ฑํ•œ๋‹ค.

 

ํŠธ๋ฆฌ ์ž๋ฃŒ๊ตฌ์กฐ

  ํŠธ๋ฆฌ ์ž๋ฃŒ๊ตฌ์กฐ๋Š” ๋…ธ๋“œ๋“ค์˜ ๊ณ„์ธต ๊ตฌ์กฐ๋กœ ์ด๋ค„์ง„๋‹ค. ์ฆ‰, ํŠธ๋ฆฌ ์ž๋ฃŒ๊ตฌ์กฐ๋Š” ๋ถ€๋ชจ ๋…ธ๋“œ์™€ ์ž์‹ ๋…ธ๋“œ๋กœ ๊ตฌ์„ฑ๋˜์–ด ๋…ธ๋“œ ๊ฐ„์˜ ๊ณ„์ธต์ (๋ถ€์ž, ํ˜•์ œ)๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋น„์„ ํ˜• ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๋งํ•œ๋‹ค. ํŠธ๋ฆฌ ์ž๋ฃŒ๊ตฌ์กฐ๋Š” ํ•˜๋‚˜์˜ ์ตœ์ƒ์œ„ ๋…ธ๋“œ์—์„œ ์‹œ์ž‘ํ•œ๋‹ค. ์ตœ์ƒ์œ„ ๋…ธ๋“œ๋Š” ๋ถ€๋ชจ ๋…ธ๋“œ๊ฐ€ ์—†์œผ๋ฉฐ ๋ฃจํŠธ ๋…ธ๋“œ๋ผ ํ•œ๋‹ค. ๋ฃจํŠธ ๋…ธ๋“œ๋Š” 0๊ฐœ ์ด์ƒ์˜ ์ž์‹ ๋…ธ๋“œ๋ฅผ ๊ฐ–๋Š”๋‹ค. ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์—†๋Š” ๋…ธ๋“œ๋ฅผ ๋ฆฌํ”„ ๋…ธ๋“œ๋ผ ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๋…ธ๋“œ ๊ฐ๋“ค๋กœ ๊ตฌ์„ฑ๋œ ํŠธ๋ฆฌ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ DOM์ด๋ผ ํ•œ๋‹ค. (DOM ํŠธ๋ฆฌ)

 

39.1.2 ๋…ธ๋“œ ๊ฐ์ฒด์˜ ํƒ€์ž…

  DOM์€ ๋…ธ๋“œ ๊ฐ์ฒด์˜ ๊ณ„์ธต์ ์ธ ๊ตฌ์กฐ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. ๋…ธ๋“œ ๊ฐ์ฒด๋Š” ์ข…๋ฅ˜๊ฐ€ ์žˆ๊ณ  ์ƒ์† ๊ตฌ์กฐ๋ฅผ ๊ฐ–๋Š”๋‹ค. ๋…ธ๋“œ ๊ฐ์ฒด๋Š” ์ด 12๊ฐœ์˜ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋‹ค.

 

๋ฌธ์„œ ๋…ธ๋“œ

  ๋ฌธ์„œ ๋…ธ๋“œ๋Š” DOM ํŠธ๋ฆฌ์˜ ์ตœ์ƒ์œ„์— ์กด์žฌํ•˜๋Š” ๋ฃจํŠธ ๋…ธ๋“œ๋กœ document ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. document ๊ฐ์ฒด๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ Œ๋”๋งํ•œ HTML ๋ฌธ์„œ ์ „์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ์ฒด๋กœ ์ „์—ญ ๊ฐ์ฒด window์˜ documnet ํ”„๋กœํผํ‹ฐ์— ๋ฐ”์ธ๋”ฉ๋˜์–ด ์žˆ๋‹ค. ๋ฌธ์„œ ๋…ธ๋“œ๋Š” ๋ฃจํŠธ ๋…ธ๋“œ๋กœ DOM ํŠธ๋ฆฌ์˜ ๋…ธ๋“œ๋“ค์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ ์ง„์ž…์  ์—ญํ• ์„ ๋‹ด๋‹นํ•œ๋‹ค. ์ฆ‰, ์š”์†Œ, ์–ดํŠธ๋ฆฌ๋ทฐํŠธ, ํ…์ŠคํŠธ ๋…ธ๋“œ์— ์ ‘๊ทผํ•˜๋ ค๋ฉด ๋ฌธ์„œ ๋…ธ๋“œ๋ฅผ ํ†ตํ•ด์•ผ ํ•œ๋‹ค.

 

์š”์†Œ ๋…ธ๋“œ

  ์š”์†Œ ๋…ธ๋“œ๋Š” HTML ์š”์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ์ฒด๋‹ค. ์š”์†Œ ๋…ธ๋“œ๋Š” HTML ์š”์†Œ ๊ฐ„์˜ ์ค‘์ฒฉ์— ์˜ํ•ด ๋ถ€์ž ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง€๋ฉฐ, ์ด ๋ถ€์ž ๊ด€๊ณ„๋ฅผ ํ†ตํ•ด ์ •๋ณด๋ฅผ ๊ตฌ์กฐํ™” ํ•œ๋‹ค.

 

์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๋…ธ๋“œ

  ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๋…ธ๋“œ๋Š” HTML ์š”์†Œ์˜ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ์ฒด๋‹ค. ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๋…ธ๋“œ๋Š” ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ ์ง€์ •๋œ HTML ์š”์†Œ์˜ ์š”์†Œ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค. ๋‹จ ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ์€ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๋…ธ๋“œ๋Š” ๋ถ€๋ชจ๋…ธ๋“œ๊ฐ€ ์—†๊ณ  ์š”์†Œ ๋…ธ๋“œ์˜ ํ˜•์ œ ๋…ธ๋“œ๋Š” ์•„๋‹ˆ๋‹ค. ๋‹จ์ง€ ์š”์†Œ ๋…ธ๋“œ์—๋งŒ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์„ ๋ฟ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๋…ธ๋“œ์— ์ ‘๊ทผํ•˜์—ฌ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ์ฐธ์กฐํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ๋จผ์ € ์š”์†Œ ๋…ธ๋“œ์— ์ ‘๊ทผํ•ด์•ผ ํ•œ๋‹ค.

 

ํ…์ŠคํŠธ ๋…ธ๋“œ

  ํ…์ŠคํŠธ ๋…ธ๋“œ๋Š” HTML ์š”์†Œ์˜ ํ…์ŠคํŠธ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ์ฒด๋‹ค. ์š”์†Œ ๋…ธ๋“œ๊ฐ€ ๋ฌธ์„œ์˜ ๊ตฌ์กฐ๋ฅผ ํ‘œํ˜„ํ•œ๋‹ค๋ฉด ํ…์ŠคํŠธ ๋…ธ๋“œ๋Š” ๋ฌธ์„œ์˜ ์ •๋ณด๋ฅผ ํ‘œํ˜„ํ•œ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ…์ŠคํŠธ ๋…ธ๋“œ๋Š” ์š”์†Œ ๋…ธ๋“œ์˜ ์ž์‹ ๋…ธ๋“œ์ด๋ฉฐ, ์ž์‹ ๋…ธ๋“œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์—†๋Š” ๋ฆฌํ”„ ๋…ธ๋“œ๋‹ค. ํ…์ŠคํŠธ ๋…ธ๋“œ๋Š” DOM ํŠธ๋ฆฌ์˜ ์ตœ์ข…๋‹จ์ด๋‹ค. ๋”ฐ๋ผ์„œ ํ…์ŠคํŠธ ๋…ธ๋“œ์— ์ ‘๊ทผํ•˜๋ ค๋ฉด ๋จผ์ € ๋ถ€๋ชจ ๋…ธ๋“œ์ธ ์š”์†Œ ๋…ธ๋“œ์— ์ ‘๊ทผํ•ด์•ผ ํ•œ๋‹ค.

 

39.1.3 ๋…ธ๋“œ ๊ฐ์ฒด์˜ ์ƒ์† ๊ตฌ์กฐ

  DOM์€ HTML ๋ฌธ์„œ์˜ ๊ณ„์ธต์  ๊ตฌ์กฐ์™€ ์ •๋ณด๋ฅผ ํ‘œํ˜„ํ•˜๋ฉฐ, ์ด๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” DOM API, ์ฆ‰ ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•˜๋Š” ํŠธ๋ฆฌ ์ž๋ฃŒ๊ตฌ์กฐ๋‹ค. DOM์„ ๊ตฌ์„ฑํ•˜๋Š” ๋…ธ๋“œ ๊ฐ์ฒด๋Š” ์ž์‹ ์˜ ๊ตฌ์กฐ์™€ ์ •๋ณด๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” DOM API๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋…ธ๋“œ ๊ฐ์ฒด๋Š” ์ž์‹ ์˜ ๋ถ€๋ชจ, ํ˜•์ œ, ์ž์‹์„ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ž์‹ ์˜ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์™€ ํ…์ŠคํŠธ๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

          HTMLHtmlE..
      Document   > HTMLDocumnet HTMLHeadE..
      Element   > HTMLElement   > HTMLMetaE..
Object   > EventTarget   > Node   > Attr   HTMLLinkE..
      CharacterData  > Text HTMLScriptE..
        comment HTMLBodyE..
          HTMLUListE..
          HTMLLIE..

  ์œ„ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๋ชจ๋“  ๋…ธ๋“œ ๊ฐ์ฒด๋Š” Object, EventTarget, Node ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›๋Š”๋‹ค. ์ถ”๊ฐ€์ ์œผ๋กœ ๋ฌธ์„œ ๋…ธ๋“œ๋Š” Domument, HTMLDocument ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›๊ณ  ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๋…ธ๋“œ๋Š” Attr, ํ…์ŠคํŠธ ๋…ธ๋“œ๋Š” CharacterData ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ๊ฐ ์ƒ์†๋ฐ›๋Š”๋‹ค.

์š”์†Œ ๋…ธ๋“œ๋Š” Element ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›๋Š”๋‹ค. ๋˜ํ•œ ์š”์†Œ ๋…ธ๋“œ๋Š” ์ถ”๊ฐ€์ ์œผ๋กœ HTMLElemnet์™€ ํƒœ๊ทธ์˜ ์ข…๋ฅ˜๋ณ„๋กœ ์„ธ๋ถ„ํ™”๋œ HTMLHtmlElement, HTMLHeadElement...๋“ฑ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›๋Š”๋‹ค. 

 

  ๊ฒฐ๊ตญ DOM์€ HTML ๋ฌธ์„œ์˜ ๊ณ„์ธต์  ๊ตฌ์กฐ์™€ ์ •๋ณด๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์€ ๋ฌผ๋ก  ๋…ธ๋“œ ๊ฐ์ฒด์˜ ์ข…๋ฅ˜, ์ฆ‰ ๋…ธ๋“œ ํƒ€์ž…์— ๋”ฐ๋ผ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์„ ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ์˜ ์ง‘ํ•œ์ธ DOM API๋กœ ์ œ๊ณตํ•œ๋‹ค. ์ด DOM API๋ฅผ ํ†ตํ•ด HTML์˜ ๊ตฌ์กฐ๋‚˜ ๋‚ด์šฉ ๋˜๋Š” ์Šคํƒ€์ผ ๋“ฑ์„ ๋™์ ์œผ๋กœ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ์ œ์ผ ํ•ต์‹ฌ์ ์ธ ๋‚ด์šฉ์ด๋‹ค.