๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ—‚ WIL

ํšจ์œจ์ ์ธ DOM ์กฐ์ž‘์œผ๋กœ ์„ฑ๋Šฅ ์ตœ์ ํ™”ํ•˜๊ธฐ

by nalong 2025. 4. 27.

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

1. ์š”์†Œ ์ˆจ๊ธฐ๊ธฐ/๋ณด์ด๊ธฐ ๋Œ€์‹  ์ƒ์„ฑ/์‚ญ์ œ ํ”ผํ•˜๊ธฐ 

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

const el = document.querySelector('#element');
el.classList.add('show'); // ์š”์†Œ๋ฅผ ๋ณด์ด๊ฒŒ ํ•จ
el.style.display = 'none'; // ์š”์†Œ๋ฅผ ์ˆจ๊น€

 

์ด ๋ฐฉ๋ฒ•์€ DOM์„ ๊ณ„์†ํ•ด์„œ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ , ๊ธฐ์กด์˜ ์š”์†Œ๋ฅผ ๋ณด์—ฌ์ฃผ๊ฑฐ๋‚˜ ์ˆจ๊ธฐ๋Š” ๋ฐฉ์‹์œผ๋กœ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ํŠนํžˆ ๋ฆฌ์ŠคํŠธ ํ•ญ๋ชฉ์ฒ˜๋Ÿผ ์ž์ฃผ ์ถ”๊ฐ€๋˜๊ณ  ์ œ๊ฑฐ๋˜๋Š” ์š”์†Œ๊ฐ€ ์žˆ์„ ๋•Œ ์œ ์šฉํ•˜๋‹ค.

2. textContent ์‚ฌ์šฉ

innerText์™€ textContent๋Š” ํ…์ŠคํŠธ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š”๋ฐ, innerText๋Š” ์Šคํƒ€์ผ ๊ณ„์‚ฐ์„ ํฌํ•จํ•œ ๋ Œ๋”๋ง์„ ๊ณ ๋ คํ•˜๋ฏ€๋กœ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๋‹ค. textContent๋Š” ์Šคํƒ€์ผ์„ ๊ณ ๋ คํ•˜์ง€ ์•Š๊ณ , ํ…์ŠคํŠธ ๋‚ด์šฉ์„ ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋” ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์ด๋‹ค.

const el = document.querySelector('#element');
el.textContent = '์ƒˆ๋กœ์šด ํ…์ŠคํŠธ';

 

3. insertAdjacentHTML ํ™œ์šฉ

HTML์„ ๋™์ ์œผ๋กœ ์‚ฝ์ž…ํ•  ๋•Œ, innerHTML๋ณด๋‹ค๋Š” insertAdjacentHTML์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์„ฑ๋Šฅ์ ์œผ๋กœ ํ›จ์”ฌ ๋” ์ข‹๋‹ค. insertAdjacentHTML์€ ๋ฌธ์ž์—ด๋กœ HTML์„ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๊ณ , ํ•ด๋‹น ๋ฐฉ์‹์€ DOM์„ ๋‹ค์‹œ ํŒŒ์‹ฑ ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋Œ€๋Ÿ‰์˜ ์ฝ˜ํ…์ธ ๋ฅผ ์‚ฝ์ž…ํ•  ๋•Œ ์„ฑ๋Šฅ์„ ํฌ๊ฒŒ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

const el = document.querySelector('#element');
el.insertAdjacentHTML('beforeend', '<div>์ถ”๊ฐ€๋œ ๋‚ด์šฉ</div>');

4. ์ด๋ฒคํŠธ ์œ„์ž„ ์‚ฌ์šฉ

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

const parent = document.querySelector('#parent');
parent.addEventListener('click', function(event) {
  if (event.target && event.target.matches('button')) {
    console.log('๋ฒ„ํŠผ ํด๋ฆญ๋จ');
  }
});

 

5. ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ์ •๋ฆฌ

์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋Š” ์ž์ฃผ ์‚ฌ์šฉ๋˜์ง€๋งŒ, ์ด๋ฅผ ์ œ๋Œ€๋กœ ์ •๋ฆฌํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋‚˜ ์„ฑ๋Šฅ ์ €ํ•˜์˜ ์›์ธ์ด ๋  ์ˆ˜ ์žˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ removeEventListener๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜๋™์œผ๋กœ ์ด๋ฒคํŠธ๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋‹ค.

function handleClick() {
  console.log("Button was clicked!");
  el.removeEventListener("click", handleClick); // ํด๋ฆญ ํ›„ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ์ œ๊ฑฐ
}

// ๋ฒ„ํŠผ์— ํด๋ฆญ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ์ถ”๊ฐ€
const el = document.querySelector("#button");
el.addEventListener("click", handleClick);

 

๋‹ค๋งŒ, removeEventListener๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ๋„, ํ•œ ๋ฒˆ๋งŒ ํ˜ธ์ถœ๋˜๋Š” ์ด๋ฒคํŠธ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”๋ฐ, once ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด, ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋Š” ํ•œ ๋ฒˆ ํ˜ธ์ถœ๋œ ํ›„ ์ž๋™์œผ๋กœ ์ œ๊ฑฐ๋œ๋‹ค.

el.addEventListener('click', handleClick, {
  once: true // ํด๋ฆญ์ด ๋ฐœ์ƒํ•˜๋ฉด ํ•œ ๋ฒˆ๋งŒ ํ˜ธ์ถœ๋˜๊ณ  ์ž๋™์œผ๋กœ ์ œ๊ฑฐ๋จ
});

 

ํ•ด๋‹น ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด, ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋Š” ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋˜๊ณ  ๊ทธ ํ›„ ์ž๋™์œผ๋กœ ์ œ๊ฑฐ๋˜๊ธฐ ๋•Œ๋ฌธ์—,  ์ด๋ฒคํŠธ๋ฅผ ํ•œ ๋ฒˆ๋งŒ ์ฒ˜๋ฆฌํ•˜๋ฉด ๋˜๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•˜๋ฉด ๋งค์šฐ ์œ ์šฉํ•˜๋‹ค.

6. requestAnimationFrame๊ณผ setTimeout์˜ ์ ์ ˆํ•œ ์‚ฌ์šฉ

์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๊ตฌํ˜„ํ•  ๋•Œ๋Š” requestAnimationFrame๊ณผ setTimeout์˜ ์ฐจ์ด๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์ค‘์š”ํ•œ๋ฐ, requestAnimationFrame์€ ๋ธŒ๋ผ์šฐ์ €์˜ ํ™”๋ฉด ๊ฐฑ์‹  ์ฃผ๊ธฐ์— ๋งž์ถฐ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์‹คํ–‰ํ•˜๋„๋ก ๋„์™€์ค€๋‹ค. ๋ฐ˜๋ฉด, setTimeout์€ ์ •ํ™•ํ•œ ํƒ€์ด๋ฐ์„ ๋ณด์žฅํ•˜์ง€ ์•Š์•„์„œ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๊ตฌํ˜„ํ•  ๋•Œ๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค.

function animate() {

  requestAnimationFrame(animate); // ๋‹ค์Œ ๋ฆฌํŽ˜์ธํŠธ ์ฃผ๊ธฐ์— ์• ๋‹ˆ๋ฉ”์ด์…˜ ์‹คํ–‰
}
requestAnimationFrame(animate);

 

++ ์ด์™€ ๊ด€๋ จํ•ด์„œ, ์ด์ „์— requestAnimationFrame์„ ์ ์šฉํ•˜์—ฌ ์„ฑ๋Šฅ์„ ๋น„๊ตํ•˜๋Š” ๊ธ€์„ ์ž‘์„ฑํ•œ ์ ์ด ์žˆ์—ˆ๋‹ค.