JavaScript

DOM & 이벤트 & BOM

1. DOM이란?

DOM (Document Object Model)

DOM은 HTML 문서를 자바스크립트가 다룰 수 있는 객체의 트리로 표현한 것이다. 브라우저는 HTML을 읽어 아래와 같은 트리 구조를 만들고, 자바스크립트는 이 트리를 통해 페이지의 내용·구조·스타일을 동적으로 바꾼다.

flowchart TD
    D["document"] --> H["html"]
    H --> HE["head"]
    H --> B["body"]
    HE --> T["title"]
    B --> H1["h1"]
    B --> P["p#demo"]
    B --> BT["button"]
    style D fill:#ede7f6,stroke:#5e35b1
    style B fill:#e8f5e9,stroke:#43a047
    style P fill:#fff3e0,stroke:#fb8c00

DOM 조작은 보통 ① 요소를 선택 → ② 내용·스타일 변경 / 생성·삭제 → ③ 이벤트에 반응의 흐름으로 이루어진다.


2. 요소 선택하기

메서드

선택 기준

반환

getElementById(id)

id

요소 하나

getElementsByClassName(name)

class

여러 개(유사 배열)

getElementsByTagName(name)

태그 이름

여러 개(유사 배열)

querySelector(selector)

CSS 선택자

첫 번째 요소

querySelectorAll(selector)

CSS 선택자

모든 요소(NodeList)

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

// CSS 선택자로 선택 (가장 유연함)
const firstMsg = document.querySelector(".message");   // 첫 번째
const allMsg = document.querySelectorAll(".message");  // 전부

querySelector 계열을 기본으로

querySelector/querySelectorAll은 CSS 선택자를 그대로 쓸 수 있어("#id", ".class", "ul > li") 가장 유연하다. 실무에서 가장 많이 사용된다.


3. 요소 내용·스타일 변경

  • element.textContent: 요소의 텍스트를 읽거나 바꾼다.

  • element.innerHTML: 요소의 HTML을 읽거나 바꾼다(태그 포함).

  • element.style.속성: 인라인 스타일을 바꾼다. CSS 속성은 카멜표기법으로 쓴다(font-size → fontSize).

const el = document.getElementById("demo");

el.textContent = "텍스트가 변경되었습니다!";
el.innerHTML = "<strong>굵은</strong> 내용";
el.style.color = "red";
el.style.fontSize = "20px";

다음은 버튼을 누르면 문단 텍스트가 바뀌는 예시다.

<p id="demo">이 텍스트는 변경될 예정입니다.</p>
<button onclick="changeText()">텍스트 변경</button>

<script>
  function changeText() {
    document.getElementById("demo").textContent = "변경되었습니다!";
  }
</script>

클릭 전 → 이 텍스트는 변경될 예정입니다.

클릭 후 → 변경되었습니다!

innerHTML 보안 주의

innerHTML에 사용자 입력값을 그대로 넣으면 악성 스크립트가 삽입될 수 있다(XSS). 단순 텍스트라면 더 안전한 textContent를 사용한다.


4. 요소 생성·추가·삭제

  • document.createElement(tag): 새 요소를 만든다.

  • 부모.appendChild(자식): 부모의 마지막 자식으로 추가한다.

  • 부모.removeChild(자식): 자식 요소를 제거한다.

// 새 <p> 요소를 만들어 컨테이너에 추가
const newP = document.createElement("p");
newP.textContent = "새로 추가된 문단입니다.";

const container = document.getElementById("container");
container.appendChild(newP);

5. 이벤트 처리

이벤트(event)는 클릭, 마우스 이동, 키 입력, 스크롤 등 사용자나 브라우저가 일으키는 사건이다. 자바스크립트로 이를 감지해 동작을 실행한다.

이벤트를 연결하는 세 가지 방법

<!-- 1) 인라인 이벤트 핸들러 (지양) -->
<button onclick="alert('클릭됨!')">클릭</button>

<!-- 2) 프로퍼티에 함수 할당 -->
<script>
  button.onclick = function () { alert("클릭!"); };
</script>

<!-- 3) addEventListener (권장) -->
<script>
  button.addEventListener("click", function () {
    alert("클릭!");
  });
</script>

addEventListener를 쓰자

addEventListener는 한 요소에 여러 핸들러를 중복 등록할 수 있고, 기존 핸들러를 덮어쓰지 않는다. 가장 권장되는 방식이다. 제거할 때는 removeEventListener를 쓴다.

이벤트 객체

이벤트가 발생하면 브라우저는 이벤트 정보를 담은 이벤트 객체를 핸들러의 첫 번째 인수로 전달한다.

button.addEventListener("click", function (event) {
  console.log(event.type);     // "click"
  console.log(event.target);   // 이벤트가 발생한 요소
  console.log(event.clientX, event.clientY);   // 마우스 좌표
});

속성

설명

type

이벤트 종류 (예: "click")

target

이벤트가 발생한 요소

clientX, clientY

마우스 좌표

key

눌린 키 값 (키보드 이벤트)

주요 이벤트 종류

분류

이벤트

발생 시점

마우스

click, dblclick, mouseover, mouseout

클릭, 더블클릭, 올림, 벗어남

키보드

keydown, keyup

키 누름, 뗌

폼

submit, change, input, focus, blur

제출, 변경, 입력, 포커스

문서/창

load, resize, scroll

로딩 완료, 크기 변경, 스크롤

실시간 입력 반영 예시:

document.getElementById("textInput").addEventListener("input", function (e) {
  document.getElementById("output").textContent = "입력한 내용: " + e.target.value;
});

입력한 내용: 안녕하세요


6. BOM (Browser Object Model)

BOM은 브라우저 창 자체를 다루는 객체들의 모음이다. DOM이 "문서"를 다룬다면, BOM은 "브라우저 환경"(주소, 화면, 히스토리 등)을 다룬다.

flowchart TD
    W["window<br/>(최상위 객체)"] --> D["document<br/>(문서 = DOM)"]
    W --> L["location<br/>(현재 URL)"]
    W --> N["navigator<br/>(브라우저 정보)"]
    W --> S["screen<br/>(화면 해상도)"]
    W --> H["history<br/>(방문 기록)"]
    style W fill:#ede7f6,stroke:#5e35b1
// window — 타이머, 새 창
setTimeout(() => alert("3초 경과"), 3000);   // 3초 뒤 실행
window.open("https://example.com");          // 새 창 열기

// location — 현재 URL / 페이지 이동
console.log(location.href);                  // 현재 주소 출력
location.href = "https://example.com";       // 페이지 이동

// navigator — 브라우저 정보
console.log(navigator.userAgent);

// screen — 화면 해상도
console.log(screen.width, screen.height);

// history — 앞/뒤로 이동
history.back();      // 이전 페이지
history.forward();   // 다음 페이지

window는 생략할 수 있다

window는 브라우저의 전역 객체라서 window.alert()을 그냥 alert()로, window.setTimeout()을 setTimeout()으로 쓸 수 있다.

마지막 수정 2026년 10월 22일