본문 바로가기
카테고리 없음

DOM(Document Object Model)이란?

by code study 2026. 5. 22.

들어가며

웹 페이지에서 버튼을 클릭하면 내용이 바뀌거나, 입력값에 따라 화면이 달라지는 경험을 해본 적이 있을 겁니다.
이런 동적인 동작이 가능한 이유가 바로 DOM(Document Object Model) 덕분입니다.
이 글에서는 DOM이 무엇인지, JavaScript로 어떻게 조작하는지 정리해보겠습니다.


DOM이란?

DOM은 HTML 문서를 JavaScript로 조작할 수 있게 만든 객체 구조입니다.
브라우저가 HTML을 읽으면 각 태그를 노드(Node) 라는 객체로 변환하고,
이 노드들을 트리 구조로 연결합니다.

[HTML 문서]                    [DOM 트리]

<html>                              document
  <head>                            └── html
    <title>제목</title>                  ├── head
  </head>                               │   └── title ("제목")
  <body>                                └── body
    <h1>안녕하세요</h1>                      ├── h1 ("안녕하세요")
    <p>반갑습니다</p>                        └── p ("반갑습니다")
  </body>
</html>

JavaScript는 이 트리 구조를 통해 HTML 요소를 읽고, 수정하고, 추가하고, 삭제할 수 있습니다.


DOM이 필요한 이유

HTML만으로는 정적인 화면만 만들 수 있습니다.
DOM을 통해 JavaScript가 HTML에 접근할 수 있어야 동적인 화면이 가능합니다.

HTML  → 화면 구조 정의
CSS   → 화면 스타일 정의
JavaScript + DOM → 화면을 동적으로 변경

DOM 요소 선택

JavaScript에서 DOM 요소에 접근하는 방법입니다.

// id로 선택
const title = document.getElementById("title");

// CSS 선택자로 선택 (하나)
const btn = document.querySelector(".btn");

// CSS 선택자로 선택 (여러 개)
const items = document.querySelectorAll(".item");

// 태그명으로 선택
const paragraphs = document.getElementsByTagName("p");

DOM 요소 읽기 / 수정

선택한 요소의 내용이나 스타일을 읽고 변경할 수 있습니다.

const title = document.getElementById("title");

// 내용 읽기
console.log(title.textContent); // "안녕하세요"
console.log(title.innerHTML);   // "<b>안녕하세요</b>"

// 내용 수정
title.textContent = "반갑습니다"; // 텍스트만 변경
title.innerHTML = "<b>반갑습니다</b>"; // HTML 포함 변경

// 스타일 수정
title.style.color = "red";
title.style.fontSize = "24px";

// 속성 수정
const link = document.querySelector("a");
link.setAttribute("href", "https://example.com");

DOM 요소 추가 / 삭제

// 요소 생성
const newItem = document.createElement("li");
newItem.textContent = "새로운 항목";

// 요소 추가
const list = document.getElementById("list");
list.appendChild(newItem);        // 마지막에 추가
list.prepend(newItem);            // 맨 앞에 추가

// 요소 삭제
const oldItem = document.getElementById("oldItem");
oldItem.remove(); // 요소 삭제

이벤트 처리

DOM의 가장 중요한 역할 중 하나는 사용자 이벤트를 감지하고 처리하는 것입니다.

const btn = document.getElementById("btn");

// 클릭 이벤트
btn.addEventListener("click", function () {
    alert("버튼이 클릭됐습니다!");
});

// 입력 이벤트
const input = document.getElementById("input");
input.addEventListener("input", function (e) {
    console.log("입력값: " + e.target.value);
});

// 마우스 오버 이벤트
const box = document.getElementById("box");
box.addEventListener("mouseover", function () {
    box.style.backgroundColor = "skyblue";
});

실전 예시 - 버튼 클릭으로 목록 추가

<!DOCTYPE html>
<html>
<body>
    <input id="inputText" type="text" placeholder="항목 입력" />
    <button id="addBtn">추가</button>
    <ul id="list"></ul>

    <script>
        const input = document.getElementById("inputText");
        const addBtn = document.getElementById("addBtn");
        const list = document.getElementById("list");

        addBtn.addEventListener("click", function () {
            const text = input.value.trim();

            if (text === "") return; // 빈 값 방지

            // 새 li 요소 생성
            const newItem = document.createElement("li");
            newItem.textContent = text;

            // 삭제 버튼 추가
            const deleteBtn = document.createElement("button");
            deleteBtn.textContent = "삭제";
            deleteBtn.addEventListener("click", function () {
                newItem.remove(); // 해당 li 삭제
            });

            newItem.appendChild(deleteBtn);
            list.appendChild(newItem); // 목록에 추가

            input.value = ""; // 입력창 초기화
        });
    </script>
</body>
</html>

DOM vs 가상 DOM (Virtual DOM)

React를 배우면 가상 DOM(Virtual DOM) 이라는 개념이 등장합니다.

[실제 DOM]
변경이 생길 때마다 브라우저가 전체를 다시 계산하고 화면을 업데이트
→ 변경이 잦으면 성능 저하

[가상 DOM - React]
변경 전후 가상 DOM을 비교 → 실제로 바뀐 부분만 실제 DOM에 반영
→ 불필요한 업데이트를 줄여 성능 향상
// 실제 DOM 직접 조작 - 매번 브라우저 업데이트
document.getElementById("count").textContent = count;

// React - 가상 DOM이 변경된 부분만 업데이트
const [count, setCount] = useState(0);
<p>{count}</p>

DOM 관련 주요 속성 정리

속성/메서드 설명
document.getElementById() id로 요소 선택
document.querySelector() CSS 선택자로 요소 하나 선택
document.querySelectorAll() CSS 선택자로 요소 여러 개 선택
element.textContent 텍스트 내용 읽기/수정
element.innerHTML HTML 포함 내용 읽기/수정
element.style 스타일 수정
element.setAttribute() 속성 설정
element.classList 클래스 추가/제거/토글
element.appendChild() 자식 요소 추가
element.remove() 요소 삭제
element.addEventListener() 이벤트 핸들러 등록

정리

  • DOM은 HTML 문서를 JavaScript로 조작할 수 있게 만든 트리 구조의 객체 모델이다.
  • 브라우저가 HTML을 읽으면 각 태그를 노드 객체로 변환하고 트리 구조로 연결한다.
  • JavaScript는 DOM을 통해 HTML 요소를 선택, 읽기, 수정, 추가, 삭제할 수 있다.
  • 이벤트 리스너를 통해 클릭, 입력 등 사용자 동작에 반응하는 동적인 화면을 만들 수 있다.
  • React는 가상 DOM을 사용해 변경된 부분만 실제 DOM에 반영해 성능을 최적화한다.