개요 객체란 DOM도 객체 document React에선 전체 흐름 📝 문제풀이
📋 목차
🌳 부록 · 뿌리 개념

DOM이 대체 뭐예요?

리액트를 배우는 사람들이 가장 많이 막히는 개념이 DOM이에요. 어려운 용어로 시작하면 더 헷갈리니, 객체(Object)부터 아주 순서대로 가볼게요. 여기까지 이해하면 "state가 바뀌면 React가 화면을 다시 그린다"가 자연스럽게 들려요.

🎯 이 장을 끝내면
📖
개요
HTML은 원래 그냥 "글자"예요
여기서부터 시작하면 DOM이 쉬워져요.

먼저 한 줄 정의부터. DOM은 브라우저가 HTML을 읽어서 메모리에 만들어 놓은, 웹페이지의 "객체 구조(트리)"예요. 이 문장이 지금은 낯설어도 괜찮아요. 차근차근 풀면 마지막엔 당연하게 들려요.

<h1>안녕하세요</h1>
<button>버튼</button>

우리 눈엔 화면처럼 보이지만, 파일 자체는 그냥 문자(텍스트) 나열이에요. 이 상태로는 제목을 바꾸거나 버튼을 누르는 "조작"이 안 돼요. 그냥 글자니까요.

🧭
이 순서로 갈 거예요. ① 객체가 뭔지 → ② DOM도 결국 객체라는 것 → ③ document로 조작하는 법 → ④ React는 그걸 대신 해준다는 것. 하나씩 쌓으면 안 헷갈려요.
🧩 DOM 트리 구조 — 펼쳐 보기
DOMDocument Object Model의 약자로, 한국어로는 문서 객체 모델이라고 부릅니다. 웹 브라우저가 HTML 문서를 이해하고 수정하기 쉽게 정리한 "이미 만들어진 문서를, 브라우저가 메모리 안에 트리 구조로 옮겨놓은 것"입니다.

DOM은 브라우저가 HTML 문서를 읽어서, JavaScript가 조작할 수 있도록 메모리에 만들어놓은 "객체 트리(구조화된 데이터)"입니다.

공장 비유는 오히려 이런 차이를 잘 보여줍니다:
💡
HTML 코드 = 원자재 (텍스트 그 자체)
DOM = 그 원자재를 분류해서 "조작 가능한 객체들의 나무 구조"로 만들어놓은 것
HTML 코드가 공장으로 들어오는 원자재라면, DOM은 이 원자재를 조립하기 쉽도록 종류별로 분류해 놓은 부품 상자입니다.
DOM의 역할자바스크립트 같은 프로그래밍 언어는 이 DOM을 통해 웹 페이지의 글자, 색상, 위치를 바꿉니다. 예를 들어, 사용자가 버튼을 눌렀을 때 화면의 팝업창이 나타나거나 사라지는 것은 모두 DOM을 조작해서 가능합니다.

DOM의 구조와 동작 원리
문서(Document): 웹 페이지 화면에 나타나는 HTML이나 XML 문서입니다.
객체 (Object): 프로그래밍 언어에서 다루기 쉽게 만든 데이터 조각입니다.
모델 (Model): 문서의 구조를 나무(Tree) 모양으로 그린 형태입니다.

DOM의 트리 구조(노드와 요소)
DOM 트리 구조는 시각적으로 보면 훨씬 이해가 빠른 개념이에요.
document html head body h1 p ul li li
이렇게 트리 구조를 보시면, 핵심은 부모-자식 관계입니다.
  • document가 맨 위 뿌리이고, 그 아래 html이 있습니다.
  • htmlheadbody, 두 자식으로 갈라집니다.
  • body는 다시 h1, p, ul 같은 실제 화면 요소들을 자식으로 가집니다.
  • ul은 또 그 아래 li(목록 항목) 여러 개를 자식으로 둘 수 있습니다.

이렇게 계속 가지를 뻗어나가는 모양이라서 "트리(나무)" 구조라고 부릅니다. HTML 코드에서 태그를 안쪽에 겹쳐 쓰는 것(중첩)이, 이 트리에서는 그대로 "부모-자식" 관계로 표현되는 거예요.
자바스크립트로 DOM을 다룰 때 document.querySelector('body')처럼 위에서부터 타고 내려가면서 원하는 노드를 찾는 것도, 결국 이 트리를 따라 이동하는 것이라고 생각하시면 됩니다.
  • document
    • html
      • head
      • body
        • h1
        • p
        • ul
          • li
          • li
그림과 태그를 나란히 대응시켜보면
그림의 노드태그의미
document(코드 전체)문서 자체, 모든 태그의 최상위 뿌리
html<html>문서의 최상위 태그
head<head>화면엔 안 보이는 문서 정보 영역
body<body>실제로 화면에 그려지는 영역
h1<h1>body의 자식 요소
p<p>body의 자식 요소
ul<ul>body의 자식 요소
li, li<li>, <li>ul의 자식 요소 (두 개)
▲ 접기
📦
객체란
관련된 값들을 하나로 묶은 것
DOM보다 더 근본 개념이라, 이걸 먼저 잡아요.

프로그램이 실행되면 컴퓨터는 메모리(RAM)에 데이터를 저장해요. let age = 30; 이라 쓰면, 메모리 어딘가(예: 100번 주소)에 30이 저장되고 age는 그 위치를 가리키는 이름이에요. (자바 메모리 편에서 본 "변수 = 값이 담긴 자리를 가리키는 이름"과 똑같아요 — [메모리 개념] 부록 참고.)

그런데 사람 한 명을 표현하려면 이름·나이·키처럼 여러 값이 필요해요. 따로따로 변수로 두면 관련 있는 데이터인데 흩어져서 불편하죠. 그래서 관련된 값들을 하나로 묶은 게 객체(Object)예요.

const person = {
  name: "홍길동",
  age: 30,
  height: 175
};
🖼️ 그림으로 보기 — 객체 = 값들의 묶음
person 변수(이름) 가리킴 객체 (메모리 속 덩어리) name : "홍길동" age : 30 height : 175 각 줄이 '속성(property)' 이에요
객체이름:값 쌍(속성)들을 하나로 묶은 덩어리예요. person.name처럼 점(.)으로 안의 값을 꺼내 써요. 변수 person은 그 덩어리를 가리키는(참조하는) 이름이고요.
🌳
DOM도 객체
브라우저가 HTML을 "객체 트리"로 만들어요

이제 핵심. 브라우저(크롬)가 HTML 글자를 읽으면, 각 요소를 객체로 바꿔서 부모–자식으로 연결된 나무(트리)를 메모리에 만들어요. 예를 들어 <h1 id="title">안녕하세요</h1>는 대략 이런 객체가 돼요(실제론 훨씬 복잡):

{
  tagName: "H1",
  id: "title",
  textContent: "안녕하세요"
}
🖼️ 그림으로 보기 — HTML → DOM 트리(객체들)
document body 자식 h1 (요소 객체) tagName : "H1" id : "title" textContent… HTML 글자를 읽어서 만든 객체들의 트리 = DOM
브라우저가 HTML을 읽어 만든 document → body → h1 …객체 트리가 바로 DOM이에요. 각 요소가 tagName·id·textContent 같은 속성을 가진 객체죠 — 그래서 "DOM은 객체 구조"라고 하는 거예요.
🔍
document
찾아서 바꾸기 — 그래서 화면이 변해요🟦 순수 JS

DOM이 객체 트리니까, 자바스크립트가 그 안의 요소를 찾아서 바꿀 수 있어요.

const title = document.getElementById("title"); // DOM에서 id가 title인 객체를 가져와
title.textContent = "반갑습니다";                 // 그 객체의 textContent 값을 바꿔

getElementById("title")는 "DOM 안의 title 객체를 가져와"라는 뜻이고, title.textContent = "반갑습니다"는 그 객체의 글자 값을 바꾸는 거예요. 값이 바뀌면 브라우저가 "DOM이 바뀌었네" 하고 화면을 다시 그려요.

🤔 왜 항상 document.가 붙어요? 웹페이지 전체도 하나의 거대한 객체거든요. 그게 바로 document예요. "현재 웹페이지 전체"를 나타내는 최상위 객체라, 모든 조작은 여기서 출발해요. (document.getElementById = "이 페이지에서 이 id 요소 찾아줘".)
⚛️
React에선
이 조작을 React가 대신 해줘요🟪 리액트

순수 자바스크립트는 요소를 하나하나 직접 찾고 바꿔야 해요. 버튼도 찾고, 제목도 찾고, 목록도 찾고… 화면이 커질수록 지옥이 돼요. 리액트는 이걸 대신 해줘요. 우리는 이렇게만 쓰면 됩니다.

<h1>{count}</h1>
// ... 그리고
setCount(count + 1);

setCount만 호출하면, React가 내부적으로 DOM 객체를 찾아 → 필요한 부분만 수정 → 화면 갱신까지 대신 해줘요. 그래서 "React = DOM을 직접 안 만지게 해주는 라이브러리"라고도 해요.

🧑‍🔧
순수 자바스크립트
요소를 하나하나 직접 찾고(getElementById) 바꿔요. 화면이 커질수록 챙길 게 늘어나요.
⚛️
React
우리는 "화면은 이렇게"만 적고 setCount만 호출해요. 찾고·바꾸고·갱신은 React가 대신 해줘요.
🔤
라이브러리(library) — 자주 쓰는 기능을 미리 만들어 모아둔 도구 모음이에요. 우리가 매번 DOM 조작 코드를 짜지 않아도, React라는 도구 모음이 그 일을 대신 처리해줘요.
가상 DOM 한 스푼. React는 진짜 DOM을 매번 건드리는 대신, 메모리 속 가벼운 복사본(가상 DOM)에서 "뭐가 바뀌었나"를 먼저 비교하고, 바뀐 부분만 진짜 DOM에 반영해요. 그래서 빠르고, 우리는 setState만 신경 쓰면 돼요.
🧭
전체 흐름
한 장으로 정리
HTML (그냥 글자) <h1 id="title">안녕하세요</h1> 브라우저가 읽음 DOM (객체 트리) document → body → h1 객체 { tagName, id, textContent } JS/React가 조작 title.textContent = "반갑습니다" 🖥️ 화면이 다시 그려짐
이 흐름이 전부예요: HTML(글자) → 브라우저가 읽어 DOM(객체 트리) → JS/React가 그 객체를 바꿈 → 화면 갱신. 여기까지 오면 "state가 바뀌면 React가 DOM을 업데이트한다"가 자연스럽게 들려요.
🧠 이 장 핵심 요약
📝
문제풀이 · 점검
배운 걸 가볍게 점검해봐요
시험이 아니라 "내가 이해했나" 확인용이에요.
🧪
네 가지 유형(객관식 · O/X · 빈칸 · 코드결과)을 섞어 두었어요. 편하게 눌러보세요.