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
📌
핵심 정리
🔍
querySelector
CSS 선택자로
요소 탐색
✏️
textContent
요소의 텍스트를
실시간 변경
🎨
classList
add / remove / toggle로
스타일 전환
👆
이벤트 리스너
addEventListener로
행동에 반응
15 / 15
🚀
다음 세션
Session 23 · HTTP와 요청/응답
URL 입력부터 화면 표시까지 — 브라우저 내부에서 벌어지는 일을 파헤친다.
렌더링, 캐시, DevTools의 세계로 들어간다.
💡 기억할 것: 화면의 변화는 모두 DOM 조작에서 출발한다.