01 / 15
SESSION 22 · Part 5 웹 개발

DOM과 이벤트 —
웹을 움직인다

요소를 찾고, 바꾸고, 반응하게 만드는 법

02 / 15
🎯

이 세션에서
배우는 것

🌲
DOM 트리
브라우저가 HTML을 객체로 만든 구조를 설명한다
🔍
요소 조작
querySelector로 요소를 찾고 내용을 바꾼다
👆
이벤트 리스너
사용자 행동에 반응하는 코드를 등록한다
03 / 15
💭

DOM
다뤄야 할까?

버튼을 누르면 색이 바뀌고, 카운터가 올라가고, 새 메시지가 뜬다 —
이 모든 실시간 변화는 JS가 DOM을 조작해 일어난다.

DOM을 알면 정적 페이지동적 앱으로 바꿀 수 있다.

04 / 15

DOM은 트리 구조

브라우저는 HTML을 파싱해 계층적인 객체 트리로 만든다.

📄 document
└─ <html>
   ├─ <head>
   │   └─ <title> "My Page"
   └─ <body>
       ├─ <h1> "Hello"
       └─ <button> "Click"

각 노드는 JavaScript 객체로, 속성과 메서드를 가진다.

05 / 15
🌲

DOM 트리와 요소 선택 —
더 깊게 이해하기

DOM은 단순한 HTML 복사본이 아니다 — JavaScript가 제어할 수 있는 살아있는 객체 구조다.

1
getElementById — ID로 하나 선택
document.getElementById('myBtn') — 전체 문서에서 id="myBtn"인 단 하나의 요소. 가장 빠르다.
2
querySelector — CSS 선택자로 하나 선택
document.querySelector('.card:first-child') — CSS 선택자 문법 그대로 사용. 더 유연하다.
3
querySelectorAll — 여러 개 선택
document.querySelectorAll('li') — 조건에 맞는 모든 요소를 NodeList로 반환. forEach로 순회 가능.
4
부모·자식·형제 관계
element.parentElement, element.children, element.nextSibling — 트리를 탐색하며 이동 가능.
06 / 15

요소를 찾고 바꾸기

CSS 선택자로 원하는 요소를 집고, 속성을 직접 수정한다.

// 요소 선택
const btn = document.querySelector('.btn');
const items = document.querySelectorAll('li');

// 내용 변경
btn.textContent = "저장됨!";
btn.style.background = "#6ee7b7";

// 클래스 토글
btn.classList.add('active');
btn.classList.remove('disabled');
btn.classList.toggle('highlight');
07 / 15
🌊

이벤트 버블링 —
실제로는 어떻게?

자식 요소를 클릭하면 이벤트가 부모·조상 요소까지 차례로 전파된다.

🔘 버튼 클릭
📦 div 전파
📄 body 전파
🌐 document 전파

핵심: 이 버블링 덕분에 부모 하나에 이벤트를 등록하면 자식 수십 개를 한 번에 처리할 수 있다 — 이것을 이벤트 위임(delegation)이라고 한다.

08 / 15
👆

이벤트 흐름

사용자의 행동은 이벤트로 전달되고, 등록된 함수가 반응한다.

🖱️ 사용자 클릭
📡 이벤트 발생
🎧 리스너 호출
✨ DOM 변경
const btn = document.querySelector('#saveBtn');

btn.addEventListener('click', (event) => {
  console.log('클릭됨!', event.target);
  btn.textContent = '저장 완료';
});
09 / 15
📱

실생활에서
이렇게 쓰여요

우리가 매일 사용하는 앱과 서비스 속에 DOM 조작이 녹아 있다.

❤️
유튜브 좋아요 버튼
클릭 시 classList.toggle('liked')로 색이 바뀌고 숫자가 올라간다 — DOM 조작의 전형
📸
인스타그램 무한스크롤
scroll 이벤트를 감지해 하단에 닿으면 새 콘텐츠를 불러와 DOM에 append한다
토글 메뉴
햄버거 버튼 클릭 시 nav.classList.toggle('open')으로 메뉴를 펼치고 닫는다

💡 이 개념이 없다면 모든 변화마다 서버에서 새 HTML 페이지를 받아야 해 웹이 느리고 불편해진다.

10 / 15
💡

자주 하는
오해 바로잡기

이렇게 생각하기 쉽지만, 실제로는 조금 다릅니다.

❌ 흔한 오해
  • DOM과 HTML은 같은 것이다
  • 이벤트는 클릭(click)밖에 없다
  • querySelector와 getElementById는 동일하다
✓ 실제로는
  • DOM은 HTML을 파싱한 후 만들어진 메모리 속 객체 트리 — 원본 파일과 다를 수 있다
  • click, input, scroll, keydown, mousemove, submit 등 수십 가지 이벤트가 있다
  • querySelector는 CSS 선택자 지원, getElementById는 ID 전용 — 용도가 다르다
11 / 15
🏗️

DOM은 설계도의 디지털 복사본

HTML은 종이 설계도, DOM은 자유롭게 수정 가능한 3D 모형이다.

🏛️ 설계도 비유
종이 설계도
=
HTML 파일 — 고정된 원본
3D 모형
=
DOM — 메모리 속 조작 가능한 복사본
모형 수정 도구
=
JavaScript — 요소를 자유롭게 변경
관람객 반응
=
이벤트 — 클릭/입력 등 신호 발생
12 / 15
🤖

이걸 알면
AI와 이렇게 대화해요

DOM과 이벤트를 이해하면 Claude나 ChatGPT를 훨씬 잘 활용할 수 있다.

👤
클릭하면 색이 바뀌는 버튼 만들어줘.
🤖
어떤 색에서 어떤 색으로 바꾸실 건가요? 버튼 하나인가요, 여러 개인가요?
👤
DOM API로 id="colorBtn" 버튼 클릭 시 배경색을 흰색과 초록색으로 토글하는 JavaScript 코드 작성해줘.
🤖
btn.addEventListener('click', () => { btn.classList.toggle('green'); }); — CSS에 .green { background: #6ee7b7; }를 추가하면 완성됩니다!
13 / 15

이렇게
이해하셨나요?

맞게 이해하셨어요
DOM은 브라우저가 HTML을 파싱해 만든 객체 트리 구조다
이렇게는 아니에요
DOM을 수정하면 원본 HTML 파일도 함께 바뀐다 (메모리 속 객체만 변경된다)
맞게 이해하셨어요
이벤트 버블링으로 자식 이벤트가 부모까지 전파된다
이렇게는 아니에요
addEventListener는 이벤트 하나에 함수 하나만 등록할 수 있다 (여러 개 등록 가능)

💪 DOM 조작과 이벤트를 이해했다면, 이제 진짜 인터랙티브 웹을 만들 수 있습니다!

14 / 15
📌

핵심 정리

🌲
DOM
HTML을 객체 트리로
변환한 구조
🔍
querySelector
CSS 선택자로
요소 탐색
✏️
textContent
요소의 텍스트를
실시간 변경
🎨
classList
add / remove / toggle로
스타일 전환
👆
이벤트 리스너
addEventListener로
행동에 반응
🌊
버블링
이벤트는 자식→부모로
전파된다
15 / 15
🚀

다음 세션
Session 23 · HTTP와 요청/응답

URL 입력부터 화면 표시까지 — 브라우저 내부에서 벌어지는 일을 파헤친다.
렌더링, 캐시, DevTools의 세계로 들어간다.

💡 기억할 것: 화면의 변화는 모두 DOM 조작에서 출발한다.

슬라이드 목록