diff --git "a/docs/39_DOM/\354\235\264\353\202\230\353\246\260.md" "b/docs/39_DOM/\354\235\264\353\202\230\353\246\260.md" new file mode 100644 index 00000000..e724d002 --- /dev/null +++ "b/docs/39_DOM/\354\235\264\353\202\230\353\246\260.md" @@ -0,0 +1,98 @@ +# 🎯 39 DOM + +[39.1 λ…Έλ“œ](#1-λ…Έλ“œ) + +## 0. DOM + +λΈŒλΌμš°μ €μ˜ λ Œλ”λ§ 엔진은 HTML λ¬Έμ„œλ₯Ό νŒŒμ‹±ν•˜μ—¬ λΈŒλΌμš°μ €κ°€ 이해할 수 μžˆλŠ” 자료ꡬ쑰인 DOM을 μƒμ„±ν•œλ‹€. + +DOM은 **HTML λ¬Έμ„œμ˜ 계측적 ꡬ쑰와 정보λ₯Ό ν‘œν˜„ν•˜λ©° 이λ₯Ό μ œμ–΄ν•  수 μžˆλŠ” API, 즉 ν”„λ‘œνΌν‹°μ™€ λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•˜λŠ” 트리 μžλ£Œκ΅¬μ‘°λ‹€.** + +## 1. λ…Έλ“œ + +### 1.1 HTML μš”μ†Œμ™€ λ…Έλ“œ 객체 + +HTML μš”μ†ŒλŠ” HTML λ¬Έμ„œλ₯Ό κ΅¬μ„±ν•˜λŠ” κ°œλ³„μ μΈ μš”μ†Œλ₯Ό μ˜λ―Έν•œλ‹€. + +HTML μš”μ†ŒλŠ” λ Œλ”λ§ 엔진에 μ˜ν•΄ νŒŒμ‹±λ˜μ–΄ DOM을 κ΅¬μ„±ν•˜λŠ” μš”μ†Œ λ…Έλ“œ 객체둜 λ³€ν™˜λœλ‹€. μ΄λ•Œ HTML μš”μ†Œμ˜ μ–΄νŠΈλ¦¬λ·°νŠΈλŠ” μ–΄νŠΈλ¦¬λ·°νŠΈ λ…Έλ“œλ‘œ, HTML μš”μ†Œμ˜ ν…μŠ€νŠΈ μ½˜ν…μΈ λŠ” ν…μŠ€νŠΈ λ…Έλ“œλ‘œ λ³€ν™˜λœλ‹€. + +HTML λ¬Έμ„œλŠ” HTML μš”μ†Œλ“€μ˜ μ§‘ν•©μœΌλ‘œ 이뀄지며, HTML μš”μ†ŒλŠ” 쀑첩 관계λ₯Ό κ°–λŠ”λ‹€. 즉, HTML μš”μ†Œμ˜ μ½˜ν…μΈ  μ˜μ—­μ—λŠ” ν…μŠ€νŠΈλΏλ§Œ μ•„λ‹ˆλΌ λ‹€λ₯Έ HTML μš”μ†Œλ„ 포함할 수 μžˆλ‹€. + +μ΄λ•Œ HTML μš”μ†Œ κ°„μ—λŠ” 쀑첩 관계에 μ˜ν•΄ 계측적인 λΆ€μž 관계가 ν˜•μ„±λœλ‹€. μ΄λŸ¬ν•œ HTML μš”μ†Œ κ°„μ˜ λΆ€μž 관계λ₯Ό λ°˜μ˜ν•˜μ—¬ HTML λ¬Έμ„œμ˜ ꡬ성 μš”μ†ŒμΈ HTML μš”μ†Œλ₯Ό κ°μ²΄ν™”ν•œ λͺ¨λ“  λ…Έλ“œ 객체듀을 트리 자료 ꡬ쑰둜 κ΅¬μ„±ν•œλ‹€. + +**트리 자료ꡬ쑰** + +트리 μžλ£Œκ΅¬μ‘°λŠ” λ…Έλ“œλ“€μ˜ 계측 ꡬ쑰둜 이뀄진닀. λΆ€λͺ¨ λ…Έλ“œμ™€ μžμ‹ λ…Έλ“œλ‘œ κ΅¬μ„±λ˜μ–΄ λ…Έλ“œ κ°„μ˜ 계측적 ꡬ쑰λ₯Ό ν‘œν˜„ν•˜λŠ” λΉ„μ„ ν˜• 자료ꡬ쑰λ₯Ό λ§ν•œλ‹€. +ν•˜λ‚˜μ˜ μ΅œμƒμœ„ λ…Έλ“œμ—μ„œ μ‹œμž‘ν•œλ‹€. + +- μ΅œμƒμœ„ λ…Έλ“œλŠ” λΆ€λͺ¨ λ…Έλ“œκ°€ μ—†μœΌλ©°, 루트 λ…Έλ“œλΌ ν•œλ‹€. +- 루트 λ…Έλ“œλŠ” 0개 μ΄μƒμ˜ μžμ‹ λ…Έλ“œλ₯Ό κ°–λŠ”λ‹€. +- μžμ‹ λ…Έλ“œκ°€ μ—†λŠ” λ…Έλ“œλ₯Ό 리프 λ…Έλ“œλΌ ν•œλ‹€. + +πŸ‘‰πŸ» λ…Έλ“œ κ°μ²΄λ“€λ‘œ κ΅¬μ„±λœ 트리 자료ꡬ쑰λ₯Ό DOM이라 ν•œλ‹€. λ…Έλ“œ 객체의 트리둜 κ΅¬μ‘°ν™”λ˜μ–΄ 있기 λ•Œλ¬Έμ— DOM을 DOM 트리라고 λΆ€λ₯΄κΈ°λ„ ν•œλ‹€. + +### 1.2 λ…Έλ“œ 객체의 νƒ€μž… + +λ‹€μŒ HTML λ¬Έμ„œλ₯Ό λ Œλ”λ§ 엔진이 νŒŒμ‹±ν•œλ‹€ μƒκ°ν•΄λ³΄μž. + +```html + + + + + + + + + + + +``` + +λ Œλ”λ§ 엔진은 μœ„ HTML λ¬Έμ„œλ₯Ό νŒŒμ‹±ν•˜μ—¬ λ‹€μŒκ³Ό 같이 DOM을 μƒμ„±ν•œλ‹€. + +![DOM](https://velog.velcdn.com/images/jjinichoi/post/ab3d8cd0-3b99-4d81-bae9-c71d7646921c/image.png) + +이처럼 DOM은 λ…Έλ“œ 객체의 계측적인 ꡬ쑰둜 κ΅¬μ„±λœλ‹€. λ…Έλ“œ κ°μ²΄λŠ” 총 12개 μ’…λ₯˜κ°€ 있으며, μ€‘μš”ν•œ λ…Έλ“œ νƒ€μž…μ€ λ‹€μŒ 4가지닀. + +**λ¬Έμ„œ λ…Έλ“œ** + +λ¬Έμ„œ λ…Έλ“œλŠ” DOM 트리의 μ΅œμƒμœ„μ— μ‘΄μž¬ν•˜λŠ” 루트 λ…Έλ“œλ‘œμ„œ document 객체λ₯Ό 가리킨닀. document κ°μ²΄λŠ” λΈŒλΌμš°μ €κ°€ λ Œλ”λ§ν•œ HTML λ¬Έμ„œ 전체λ₯Ό κ°€λ¦¬ν‚€λŠ” κ°μ²΄λ‘œμ„œ μ „μ—­ 객체 window의 document ν”„λ‘œνΌν‹°μ— λ°”μΈλ”©λ˜μ–΄ μžˆλ‹€. + +λ¬Έμ„œλ…Έλ“œ, 즉 document κ°μ²΄λŠ” DOM 트리의 루트 λ…Έλ“œμ΄λ―€λ‘œ DOM 트리의 λ…Έλ“œλ“€μ— μ ‘κ·Όν•˜κΈ° μœ„ν•œ μ§„μž…μ  역할을 λ‹΄λ‹Ήν•œλ‹€. 즉, μš”μ†Œ, μ–΄νŠΈλ¦¬λ·°νŠΈ, ν…μŠ€νŠΈ λ…Έλ“œμ— μ ‘κ·Όν•˜λ €λ©΄ λ¬Έμ„œ λ…Έλ“œλ₯Ό 톡해야 ν•œλ‹€. + +**μš”μ†Œ λ…Έλ“œ** + +μš”μ†Œ λ…Έλ“œλŠ” HTML μš”μ†Œλ₯Ό κ°€λ¦¬ν‚€λŠ” 객체닀. + +μš”μ†Œ λ…Έλ“œλŠ” HTML μš”μ†Œ κ°„μ˜ 쀑첩에 μ˜ν•΄ λΆ€μž 관계λ₯Ό 가지며, 이 λΆ€μž 관계λ₯Ό 톡해 정보λ₯Ό κ΅¬μ‘°ν™”ν•œλ‹€. λ”°λΌμ„œ μš”μ†Œ λ…Έλ“œλŠ” λ¬Έμ„œμ˜ ꡬ쑰λ₯Ό ν‘œν˜„ν•œλ‹€κ³  ν•  수 μžˆλ‹€. + +**μ–΄νŠΈλ¦¬λ·°νŠΈ λ…Έλ“œ** + +μ–΄νŠΈλ¦¬λ·°νŠΈ λ…Έλ“œλŠ” HTML μš”μ†Œμ˜ μ–΄νŠΈλ¦¬λ·°νŠΈλ₯Ό κ°€λ¦¬ν‚€λŠ” 객체닀. μ–΄νŠΈλ¦¬λ·°νŠΈ λ…Έλ“œλŠ” μ–΄νŠΈλ¦¬λ·°νŠΈκ°€ μ§€μ •λœ HTML μš”μ†Œμ˜ μš”μ†Œ λ…Έλ“œμ™€ μ—°κ²°λ˜μ–΄ μžˆλ‹€. 단, μš”μ†Œ λ…Έλ“œλŠ” λΆ€λͺ¨ λ…Έλ“œμ™€ μ—°κ²°λ˜μ–΄ μžˆμ§€λ§Œ μ–΄νŠΈλ¦¬λ·°νŠΈ λ…Έλ“œλŠ” λΆ€λͺ¨ λ…Έλ“œμ™€ μ—°κ²°λ˜μ–΄ μžˆμ§€ μ•Šκ³  μš”μ†Œ λ…Έλ“œμ—λ§Œ μ—°κ²°λ˜μ–΄ μžˆλ‹€. + +μ–΄νŠΈλ¦¬λ·°νŠΈ λ…Έλ“œμ— μ ‘κ·Όν•˜μ—¬ μ–΄νŠΈλ¦¬λ·°νŠΈλ₯Ό μ°Έμ‘°ν•˜κ±°λ‚˜ λ³€κ²½ν•˜λ €λ©΄ λ¨Όμ € μš”μ†Œ λ…Έλ“œμ— μ ‘κ·Όν•΄μ•Ό ν•œλ‹€. + +**ν…μŠ€νŠΈ λ…Έλ“œ** + +ν…μŠ€νŠΈ λ…Έλ“œλŠ” HTML μš”μ†Œμ˜ ν…μŠ€νŠΈλ₯Ό κ°€λ¦¬ν‚€λŠ” 객체닀. μš”μ†Œ λ…Έλ“œκ°€ λ¬Έμ„œμ˜ ꡬ쑰λ₯Ό ν‘œν˜„ν•œλ‹€λ©΄ ν…μŠ€νŠΈ λ…Έλ“œλŠ” λ¬Έμ„œμ˜ 정보λ₯Ό ν‘œν˜„ν•œλ‹€κ³  ν•  수 μžˆλ‹€. ν…μŠ€νŠΈ λ…Έλ“œλŠ” μš”μ†Œ λ…Έλ“œμ˜ μžμ‹ λ…Έλ“œμ΄λ©°, μžμ‹ λ…Έλ“œλ₯Ό κ°€μ§ˆ 수 μ—†λŠ” 리프 λ…Έλ“œλ‹€. 즉, ν…μŠ€νŠΈ λ…Έλ“œλŠ” DOM 트리의 μ΅œμ’…λ‹¨μ΄λ‹€. λ”°λΌμ„œ ν…μŠ€νŠΈ λ…Έλ“œμ— μ ‘κ·Όν•˜λ €λ©΄ λ¨Όμ € λΆ€λͺ¨ λ…Έλ“œμΈ μš”μ†Œ λ…Έλ“œμ— μ ‘κ·Όν•΄μ•Ό ν•œλ‹€. + +### 1.3 λ…Έλ“œ 객체의 상속 ꡬ쑰 + +![λ…Έλ“œ 객체의 상속 ꡬ쑰](https://velog.velcdn.com/images/jjinichoi/post/d068670d-5937-41ef-9dfd-2b99774d4b06/image.png) + +ν”„λ‘œν† νƒ€μž… 체인 κ΄€μ μ—μ„œ μ‚΄νŽ΄λ΄€μ„ λ•Œ, 예λ₯Ό λ“€μ–΄ input μš”μ†Œλ₯Ό νŒŒμ‹±ν•˜μ—¬ κ°μ²΄ν™”ν•œ input μš”μ†Œ λ…Έλ“œ κ°μ²΄λŠ” HTMLInputElement, HTMLElement, Element, Node, EventTarget, Object의 prototype에 λ°”μΈλ”©λ˜μ–΄ μžˆλŠ” ν”„λ‘œν† νƒ€μž… 객체λ₯Ό μƒμ†λ°›λŠ”λ‹€. 즉, input μš”μ†Œ λ…Έλ“œ κ°μ²΄λŠ” ν”„λ‘œν† νƒ€μž… 체인에 μžˆλŠ” λͺ¨λ“  ν”„λ‘œν† νƒ€μž…μ˜ ν”„λ‘œνΌν‹°λ‚˜ λ©”μ„œλ“œλ₯Ό 상속받아 μ‚¬μš©ν•  수 μžˆλ‹€. + +λ…Έλ“œ κ°μ²΄μ—λŠ” λ…Έλ“œ 객체의 μ’…λ₯˜, 즉 νƒ€μž…μ— 상관없이 λͺ¨λ“  λ…Έλ“œ 객체가 κ³΅ν†΅μœΌλ‘œ κ°–λŠ” κΈ°λŠ₯도 있고, λ…Έλ“œ νƒ€μž…μ— 따라 κ³ μœ ν•œ κΈ°λŠ₯도 μžˆλ‹€. 예λ₯Ό λ“€μ–΄, λͺ¨λ“  λ…Έλ“œ κ°μ²΄λŠ” κ³΅ν†΅μ μœΌλ‘œ 이벀트λ₯Ό λ°œμƒμ‹œν‚¬ 수 μžˆλ‹€. + +HTML μš”μ†Œκ°€ κ°μ²΄ν™”λœ μš”μ†Œ λ…Έλ“œ κ°μ²΄λŠ” HTML μš”μ†Œκ°€ κ°–λŠ” 곡톡적인 κΈ°λŠ₯이 μžˆλ‹€. 예λ₯Ό λ“€μ–΄ input μš”μ†Œ λ…Έλ“œ 객체와 div μš”μ†Œ λ…Έλ“œ κ°μ²΄λŠ” λͺ¨λ‘ HTML μš”μ†Œμ˜ μŠ€νƒ€μΌμ„ λ‚˜νƒ€λ‚΄λŠ” style ν”„λ‘œνΌν‹°κ°€ μžˆλ‹€. 이처럼 HTML μš”μ†Œκ°€ κ°–λŠ” 곡톡적인 κΈ°λŠ₯은 HTMLElement μΈν„°νŽ˜μ΄μŠ€κ°€ μ œκ³΅ν•œλ‹€. + +ν•˜μ§€λ§Œ μš”μ†Œ λ…Έλ“œ κ°μ²΄λŠ” HTML μš”μ†Œμ˜ μ’…λ₯˜μ— 따라 κ³ μœ ν•œ κΈ°λŠ₯도 μžˆλ‹€. 예λ₯Ό λ“€μ–΄ input μš”μ†Œ λ…Έλ“œ κ°μ²΄λŠ” value ν”„λ‘œνΌν‹°κ°€ ν•„μš”ν•˜μ§€λ§Œ div μš”μ†Œ λ…Έλ“œ κ°μ²΄λŠ” value ν”„λ‘œνΌν‹°κ°€ ν•„μš”ν•˜μ§€ μ•Šλ‹€. λ”°λΌμ„œ ν•„μš”ν•œ κΈ°λŠ₯을 μ œκ³΅ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€κ°€ HTML μš”μ†Œμ˜ μ’…λ₯˜μ— 따라 각각 λ‹€λ₯΄λ‹€. + +이처럼 λ…Έλ“œ κ°μ²΄λŠ” κ³΅ν†΅λœ κΈ°λŠ₯일수둝 ν”„λ‘œν† νƒ€μž… 체인의 μƒμœ„μ—, κ°œλ³„μ μΈ 고유 κΈ°λŠ₯일수둝 ν”„λ‘œν† νƒ€μž… 체인의 ν•˜μœ„μ— ν”„λ‘œν† νƒ€μž… 체인을 κ΅¬μΆ•ν•˜μ—¬ λ…Έλ“œ 객체에 ν•„μš”ν•œ κΈ°λŠ₯, 즉 ν”„λ‘œνΌν‹°μ™€ λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•˜λŠ” 상속 ꡬ쑰λ₯Ό κ°–λŠ”λ‹€. + +πŸ‘‰πŸ» DOM은 HTML λ¬Έμ„œμ˜ 계측적 ꡬ쑰와 정보λ₯Ό ν‘œν˜„ν•˜λŠ” 것은 λ¬Όλ‘  λ…Έλ“œ 객체의 μ’…λ₯˜, 즉 λ…Έλ“œ νƒ€μž…μ— 따라 ν•„μš”ν•œ κΈ°λŠ₯을 ν”„λ‘œνΌν‹°μ™€ λ©”μ„œλ“œμ˜ 집합인 DOM API둜 μ œκ³΅ν•œλ‹€. 이 DOM APIλ₯Ό 톡해 HTML의 κ΅¬μ‘°λ‚˜ λ‚΄μš© λ˜λŠ” μŠ€νƒ€μΌ 등을 λ™μ μœΌλ‘œ μ‘°μž‘ν•  수 μžˆλ‹€.