[Javascript] DOM이란?

SNXWXH·2025년 3월 12일

Javascript

목록 보기
6/13
post-thumbnail

DOM이란?

  • HTML, XML 문서를 객체(Object) 기반의 트리 구조로 표현한 프로그래밍 인터페이스
  • HTML 문서를 브라우저가 파싱(Parsing) 하면 DOM 트리를 생성
  • JavaScript를 이용해 DOM을 조작
  • DOM을 통해 웹 문서를 동적으로 변경, 추가, 삭제 가능

DOM의 구성 요소 (Node 타입)

  • DOM은 여러 개의 노드(Node) 로 구성
  • 노드는 HTML 문서의 각 요소를 표현
노드 타입설명예제
Document 노드문서 전체를 나타내는 최상위 노드document
Element 노드HTML 태그를 의미<div>, <h1>
Text 노드태그 안의 텍스트를 의미"Hello World"
Attribute 노드요소의 속성을 의미class="btn"
Comment 노드주석을 의미<!-- 주석 -->

DOM 트리 구조 이해하기

DOM 트리 구조 표현

Document
 ├── <html>
 │   ├── <head>
 │   │   ├── <title> → "DOM Example"
 │   ├── <body>
 │       ├── <h1 id="title"> → "Hello DOM"
 │       ├── <p class="desc"> → "DOM 트리 구조 예제"
<!DOCTYPE html>
<html>
  <head>
    <title>DOM Example</title>
  </head>
  <body>
    <h1 id="title">Hello DOM</h1>
    <p class="desc">DOM 트리 구조 예제</p>
  </body>
</html>
  • HTML 요소들은 계층적인 트리 구조 로 구성
  • 각 태그(Element)는 노드(Node) 로 표현되며, 자식 요소를 가질 수 있음
  • 텍스트는 Text 노드로 분리 되어 저장

DOM 조작 (탐색, 생성, 수정, 삭제)

DOM 요소 선택 (탐색)

<h1 id="title">Hello DOM</h1>
<p class="desc">DOM 트리 구조 예제</p>
// ID로 요소 선택
const title = document.getElementById("title");
console.log(title.textContent); // "Hello DOM"

// 클래스 선택
const paragraph = document.querySelector(".desc");
console.log(paragraph.textContent); // "DOM 트리 구조 예제"

// 태그명으로 선택
const paragraphs = document.getElementsByTagName("p");
console.log(paragraphs[0].textContent); // "DOM 트리 구조 예제"
선택 방법메소드반환 타입
ID로 선택document.getElementById(id)단일 요소 (Element)
클래스 선택document.querySelector(".class")첫 번째 매칭 요소 (Element)
태그명 선택document.getElementsByTagName("tag")HTMLCollection (유사 배열)

DOM 요소 생성 및 추가

// 새로운 요소 생성
const newParagraph = document.createElement("p");
newParagraph.textContent = "새로운 문장 추가됨!";

// 특정 부모 요소에 추가
document.body.appendChild(newParagraph);

결과 (HTML 변경됨)

<body>
  <h1 id="title">Hello DOM</h1>
  <p class="desc">DOM 트리 구조 예제</p>
  <p>새로운 문장 추가됨!</p>
</body>
메소드설명
document.createElement(tag)새로운 요소 생성
parent.appendChild(child)부모 요소의 자식으로 추가

DOM 요소 수정

  • 기존 요소의 속성, 텍스트, HTML을 변경 가능
// 텍스트 변경
title.textContent = "변경된 제목";

// HTML 변경
paragraph.innerHTML = "<b>굵은 글씨</b>";

// 속성 변경
paragraph.setAttribute("class", "new-class");
메소드 / 프로퍼티설명
element.textContent요소의 텍스트 내용 변경
element.innerHTML요소의 HTML 변경
element.setAttribute(name, value)속성 추가/변경

DOM 요소 삭제

// 특정 요소 삭제
document.body.removeChild(newParagraph);

// 요소 자체 삭제
paragraph.remove();
메소드설명
parent.removeChild(child)특정 자식 요소 제거
element.remove()해당 요소 자체 제거

이벤트(Event)와 이벤트 리스너

  • DOM 요소에 이벤트를 추가하여 사용자와의 상호작용을 처리 가능
const button = document.createElement("button");
button.textContent = "클릭하세요";
document.body.appendChild(button);

// 클릭 이벤트 추가
button.addEventListener("click", function () {
  alert("버튼이 클릭됨!");
});
이벤트 등록 방식설명
element.onclick = function()단순한 이벤트 핸들러
element.addEventListener("event", function)여러 개의 이벤트 등록 가능

DOM 최적화 기법

  • DOM 조작이 많을 경우 성능 최적화가 필요함

Fragment 사용

  • document.createDocumentFragment() 를 사용하면 DOM에 직접 삽입하는 연산을 감소 가능
const fragment = document.createDocumentFragment();
for (let i = 0; i < 100; i++) {
  let p = document.createElement("p");
  p.textContent = `문장 ${i}`;
  fragment.appendChild(p);
}
document.body.appendChild(fragment); // 한 번만 DOM에 삽입

Reflow & Repaint 최소화

  • 스타일 변경 시 classList 를 활용하면 Reflow 비용을 절감 가능
// Bad
element.style.color = "red";
element.style.fontSize = "20px";

// Good
element.classList.add("active");

Debounce & Throttle 적용

  • scroll, resize 이벤트가 과도하게 발생하는 것을 방지 가능
function debounce(func, delay) {
  let timer;
  return function () {
    clearTimeout(timer);
    timer = setTimeout(func, delay);
  };
}

window.addEventListener("resize", debounce(() => {
  console.log("Resized!");
}, 300));
profile
세상은 호락호락하지 않다. 괜찮다. 나도 호락호락하지 않으니까.

0개의 댓글