[JavaScript] - DOM๊ณผ DOM API

์–ด์ œ ๋™๊ธฐ์™€ ๋น„๋™๊ธฐ์— ๋Œ€ํ•ด ํ•™์Šตํ–ˆ๋˜ ๋ฐ ์ด์–ด, ์˜ค๋Š˜์€ ํšจ๋นˆ๋‹˜์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ•์˜๋ฅผ ํ†ตํ•ด DOM๊ณผ DOM API์— ๋Œ€ํ•ด ๋ณต์Šตํ–ˆ๋‹ค.

 

DOM์€ ์›น ๊ฐœ๋ฐœ์—์„œ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ด๋ฉด์„œ๋„ ์ค‘์š”ํ•œ ๊ฐœ๋… ์ค‘ ํ•˜๋‚˜๋กœ, HTML ๋ฌธ์„œ๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์กฐํ™”ํ•œ ํŠธ๋ฆฌ ํ˜•ํƒœ์˜ ๊ฐ์ฒด ๋ชจ๋ธ์ด๋‹ค.

 

์ด๋ฒˆ ๋ณต์Šต์„ ํ†ตํ•ด DOM ์š”์†Œ๋ฅผ ์„ ํƒํ•˜๊ณ  ์กฐ์ž‘ํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฉ”์„œ๋“œ๋“ค, ๊ทธ๋ฆฌ๊ณ  ์ด๋ฒคํŠธ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ์‹ ๋“ฑ

์„ ๋‹ค์‹œ ํ•œ ๋ฒˆ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

๐Ÿšฉ DOM๊ณผ DOM API

DOM์ด๋ž€?

  • DOM(Document Object Model)์€ ์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ HTML ๋ฌธ์„œ๋ฅผ ํ•ด์„ํ•ด ๊ฐ์ฒด ํ˜•ํƒœ๋กœ ํ‘œํ˜„ํ•œ ๊ตฌ์กฐ
  • HTML์˜ ๊ฐ ํƒœ๊ทธ๋Š” DOM ํŠธ๋ฆฌ์—์„œ ๋…ธ๋“œ(Node)๊ฐ€ ๋˜๋ฉฐ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ํ•ด๋‹น ๋…ธ๋“œ์— ์ ‘๊ทผํ•˜๊ณ  ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์Œ

Web์ด๋ž€?

  • ์ธํ„ฐ๋„ท ์ƒ์—์„œ ์ •๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์‹œ์Šคํ…œ
  • ์ •์‹ ๋ช…์นญ: World Wide Web (WWW)

๐Ÿง‘‍๐Ÿ’ป ๊ฐœ๋ฐœ์ž ์ž…์žฅ์—์„œ ์›น์ด๋ž€?

  • ์›น์€ ์‚ฌ์šฉ์ž์™€ ์„œ๋ฒ„๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ์ฐฝ๊ตฌ 
  • ๊ฐœ๋ฐœ์ž๋Š” ์ด ์›น ์ฐฝ๊ตฌ๋ฅผ ํ†ตํ•ด ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๊ณ , ์‚ฌ์šฉ์ž์™€ ์†Œํ†ต

์›น์˜ ๊ตฌ์„ฑ ์š”์†Œ

  • HTML: ๋ฌธ์„œ์˜ ๊ตฌ์กฐ (์˜ˆ: ์ œ๋ชฉ, ๋ฌธ๋‹จ, ๋ฒ„ํŠผ ๋“ฑ)
  • CSS: ๋ฌธ์„œ์˜ ์Šคํƒ€์ผ (์˜ˆ: ์ƒ‰์ƒ, ์œ„์น˜, ํฌ๊ธฐ)
  • JavaScript: ๋™์ ์ธ ๊ธฐ๋Šฅ (์˜ˆ: ํด๋ฆญ ์‹œ ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ)

๐Ÿ‘‰ DOM์€ HTML๊ณผ JavaScript๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•˜๋ฉฐ, ์›น ํŽ˜์ด์ง€๋ฅผ ๋™์ ์œผ๋กœ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ์„œํฌํŠธ


DOM ํŠธ๋ฆฌ๋ž€?

  • DOM์€ HTML ๋ฌธ์„œ๋ฅผ ํŠธ๋ฆฌ ๊ตฌ์กฐ๋กœ ํ‘œํ˜„
  • ๊ฐ ์š”์†Œ๋Š” ๋ถ€๋ชจ-์ž์‹ ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง€๋ฉฐ, ๋ฃจํŠธ๋Š” <html>

DOM API

  • DOM ํŠธ๋ฆฌ๋ฅผ ์กฐ์ž‘ํ•˜๊ธฐ ์œ„ํ•œ ๋ธŒ๋ผ์šฐ์ € ๋‚ด์žฅ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ•จ์ˆ˜(๋ฉ”์„œ๋“œ)
  • ์ด๋ฅผ ์ด์šฉํ•˜๋ฉด HTML ์š”์†Œ์— ์ ‘๊ทผํ•˜๊ณ , ์ถ”๊ฐ€/์‚ญ์ œํ•˜๊ฑฐ๋‚˜ ์ด๋ฒคํŠธ ๋“ฑ๋ก ๊ฐ€๋Šฅ

DOM ์š”์†Œ ์„ ํƒ ๊ด€๋ จ ๋ฉ”์„œ๋“œ

๋ฉ”์„œ๋“œ ์„ค๋ช…
getElementById(id) ํŠน์ • ID๋ฅผ ๊ฐ€์ง„ ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜
getElementsByClassName(class) ํ•ด๋‹น ํด๋ž˜์Šค ์ด๋ฆ„์„ ๊ฐ€์ง„ ์š”์†Œ๋“ค ๋ฐ˜ํ™˜ (HTMLCollection)
getElementsByTagName(tag) ํ•ด๋‹น ํƒœ๊ทธ ์ด๋ฆ„์„ ๊ฐ€์ง„ ์š”์†Œ๋“ค ๋ฐ˜ํ™˜ (HTMLCollection)
querySelector(selector) CSS ์„ ํƒ์ž ๋ฐฉ์‹์œผ๋กœ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ ๋ฐ˜ํ™˜
querySelectorAll(selector) CSS ์„ ํƒ์ž ๋ฐฉ์‹์œผ๋กœ ๋ชจ๋“  ์š”์†Œ (NodeList) ๋ฐ˜ํ™˜

 

document.getElementById('myId');              // ID๋กœ ์š”์†Œ ์„ ํƒ
document.querySelector('.myClass');           // CSS ์„ ํƒ์ž ๋ฐฉ์‹ (์ฒซ ๋ฒˆ์งธ ์š”์†Œ)
document.querySelectorAll('.myClass');        // ์—ฌ๋Ÿฌ ์š”์†Œ ์„ ํƒ (NodeList)
document.getElementsByClassName('myClass');   // ํด๋ž˜์Šค ์ด๋ฆ„์œผ๋กœ ์„ ํƒ
document.getElementsByTagName('div');         // ํƒœ๊ทธ ์ด๋ฆ„์œผ๋กœ ์„ ํƒ
  • โœ… querySelector์™€ querySelectorAll์€ CSS ์„ ํƒ์ž ๋ฐฉ์‹์ด๋ผ ๋งค์šฐ ์ง๊ด€์ 

 

DOM ์š”์†Œ ์ƒ์„ฑ ๋ฐ ์กฐ์ž‘ ๋ฉ”์„œ๋“œ

๋ฉ”์„œ๋“œ ์„ค๋ช…
createElement(tag) ์ƒˆ HTML ์š”์†Œ ์ƒ์„ฑ
createTextNode(text) ํ…์ŠคํŠธ ๋…ธ๋“œ ์ƒ์„ฑ
appendChild(node) ๋ถ€๋ชจ ์š”์†Œ์— ์ž์‹ ์š”์†Œ ์ถ”๊ฐ€
innerHTML ์š”์†Œ ๋‚ด๋ถ€์˜ HTML ๋‚ด์šฉ์„ ์ฝ๊ฑฐ๋‚˜ ๋ณ€๊ฒฝ

 

// ์š”์†Œ ์ƒ์„ฑ
const newDiv = document.createElement('div');
newDiv.textContent = '์ƒˆ๋กœ์šด DIV์ž…๋‹ˆ๋‹ค';

// ์š”์†Œ ์ถ”๊ฐ€
document.body.appendChild(newDiv);

// ์š”์†Œ ๋‚ด์šฉ ์ˆ˜์ •
const heading = document.querySelector('h1');
heading.innerHTML = '๋ฐ”๋€ ์ œ๋ชฉ์ž…๋‹ˆ๋‹ค';

 

DOM ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ

๋ฉ”์„œ๋“œ ์„ค๋ช…
addEventListener(type, callback) ํด๋ฆญ, ์ž…๋ ฅ ๋“ฑ์˜ ์ด๋ฒคํŠธ๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ์‹คํ–‰

 

const button = document.querySelector('#btn');

button.addEventListener('click', () => {
  alert('๋ฒ„ํŠผ์ด ํด๋ฆญ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!');
});
  • ๐Ÿ’ก ์ด๋ฒคํŠธ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์‚ฌ์šฉ์ž์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ํ•ต์‹ฌ (ํด๋ฆญ, ํ‚ค๋ณด๋“œ ์ž…๋ ฅ ๋“ฑ)

์ •๋ฆฌ

  • DOM์€ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ HTML์„ ํ•ด์„ํ•œ ๊ฐ์ฒด ํŠธ๋ฆฌ ๊ตฌ์กฐ
  • DOM API๋ฅผ ํ†ตํ•ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ HTML ์š”์†Œ๋ฅผ ์„ ํƒ, ์ˆ˜์ •, ์ƒ์„ฑ ๊ฐ€๋Šฅ