본문 바로가기
  • 코딩, 허쌤이 떠먹여 줄게
FrontEnd/Javascript

11장. DOM 조작

by 허쌤 2026. 1. 10.

11장. DOM 조작

DOM이란?

DOM (Document Object Model)은 HTML 문서를 객체로 표현한 것입니다. JavaScript를 통해 HTML 요소에 접근하고 조작할 수 있게 해줍니다.

DOM의 역할

  • HTML 요소 선택
  • 요소의 내용 변경
  • 요소의 스타일 변경
  • 요소 추가/삭제
  • 이벤트 처리

1. DOM 요소 선택

getElementById()

ID로 요소를 선택합니다.

<button id="btn">클릭</button>
const btn = document.getElementById('btn');
console.log(btn);

getElementsByClassName()

클래스 이름으로 요소들을 선택합니다 (배열 반환).

<div class="item">항목 1</div>
<div class="item">항목 2</div>
const items = document.getElementsByClassName('item');
console.log(items);  // HTMLCollection (배열과 유사)

getElementsByTagName()

태그 이름으로 요소들을 선택합니다.

<p>문단 1</p>
<p>문단 2</p>
const paragraphs = document.getElementsByTagName('p');
console.log(paragraphs);

querySelector() (권장)

CSS 선택자를 사용하여 첫 번째 요소를 선택합니다.

<div class="container">
    <p class="text">텍스트</p>
</div>
const text = document.querySelector('.text');
const container = document.querySelector('.container');
const firstP = document.querySelector('p');

querySelectorAll() (권장)

CSS 선택자를 사용하여 모든 요소를 선택합니다 (배열 반환).

<p class="item">항목 1</p>
<p class="item">항목 2</p>
<p class="item">항목 3</p>
const items = document.querySelectorAll('.item');
items.forEach(item => {
    console.log(item.textContent);
});

2. 요소 내용 변경

textContent

텍스트 내용을 가져오거나 설정합니다.

<p id="text">원본 텍스트</p>
const text = document.getElementById('text');
console.log(text.textContent);  // "원본 텍스트"

text.textContent = '변경된 텍스트';

innerHTML

HTML 내용을 가져오거나 설정합니다.

<div id="container"></div>
const container = document.getElementById('container');
container.innerHTML = '<h1>제목</h1><p>내용</p>';

주의: 사용자 입력을 innerHTML에 넣으면 XSS 공격 위험이 있습니다!

innerText

보이는 텍스트만 가져옵니다 (CSS에 의해 숨겨진 텍스트 제외).

const element = document.querySelector('.text');
console.log(element.innerText);

3. 요소 속성 조작

getAttribute() / setAttribute()

<img id="image" src="old.jpg" alt="이미지">
const img = document.getElementById('image');

// 속성 가져오기
console.log(img.getAttribute('src'));  // "old.jpg"

// 속성 설정하기
img.setAttribute('src', 'new.jpg');
img.setAttribute('alt', '새 이미지');

속성 직접 접근

const img = document.getElementById('image');

// 읽기
console.log(img.src);
console.log(img.alt);

// 쓰기
img.src = 'new.jpg';
img.alt = '새 이미지';

classList

클래스를 조작합니다.

<div id="box">박스</div>
const box = document.getElementById('box');

// 클래스 추가
box.classList.add('active');
box.classList.add('highlight');

// 클래스 제거
box.classList.remove('active');

// 클래스 토글
box.classList.toggle('active');

// 클래스 확인
if (box.classList.contains('active')) {
    console.log('active 클래스가 있습니다');
}

4. 요소 스타일 변경

style 속성

<div id="box">박스</div>
const box = document.getElementById('box');

// 스타일 직접 설정
box.style.color = 'red';
box.style.backgroundColor = 'blue';
box.style.fontSize = '20px';
box.style.padding = '10px';

// 여러 스타일 한 번에
box.style.cssText = 'color: red; background: blue; padding: 10px;';

주의: CSS 속성명은 camelCase로 변환됩니다 (background-colorbackgroundColor).


5. 요소 생성 및 추가

createElement()

새로운 요소를 생성합니다.

const newDiv = document.createElement('div');
newDiv.textContent = '새로운 div';
newDiv.className = 'new-item';

appendChild()

자식 요소를 추가합니다.

<div id="container"></div>
const container = document.getElementById('container');
const newP = document.createElement('p');
newP.textContent = '새로운 문단';
container.appendChild(newP);

insertBefore()

특정 위치에 요소를 삽입합니다.

const container = document.getElementById('container');
const newP = document.createElement('p');
newP.textContent = '첫 번째 문단';
const firstChild = container.firstChild;
container.insertBefore(newP, firstChild);

removeChild()

요소를 제거합니다.

const container = document.getElementById('container');
const child = container.querySelector('.item');
container.removeChild(child);

remove()

요소를 직접 제거합니다 (ES6+).

const item = document.querySelector('.item');
item.remove();

6. 실전 예제

예제 1: 버튼 클릭 시 텍스트 변경

<h1 id="title">제목</h1>
<button id="btn">변경</button>
const btn = document.getElementById('btn');
const title = document.getElementById('title');

btn.addEventListener('click', function() {
    title.textContent = '변경된 제목';
});

예제 2: 리스트에 항목 추가

<ul id="list"></ul>
<input type="text" id="input">
<button id="addBtn">추가</button>
const addBtn = document.getElementById('addBtn');
const input = document.getElementById('input');
const list = document.getElementById('list');

addBtn.addEventListener('click', function() {
    const text = input.value;
    if (text.trim() !== '') {
        const li = document.createElement('li');
        li.textContent = text;
        list.appendChild(li);
        input.value = '';  // 입력 필드 초기화
    }
});

예제 3: 이미지 변경

<img id="image" src="image1.jpg" alt="이미지">
<button id="changeBtn">이미지 변경</button>
const changeBtn = document.getElementById('changeBtn');
const image = document.getElementById('image');
let currentImage = 1;

changeBtn.addEventListener('click', function() {
    currentImage = currentImage === 1 ? 2 : 1;
    image.src = `image${currentImage}.jpg`;
});

예제 4: 동적 스타일 변경

<div id="box">박스</div>
<button id="colorBtn">색상 변경</button>
const colorBtn = document.getElementById('colorBtn');
const box = document.getElementById('box');
const colors = ['red', 'blue', 'green', 'yellow'];
let currentIndex = 0;

colorBtn.addEventListener('click', function() {
    currentIndex = (currentIndex + 1) % colors.length;
    box.style.backgroundColor = colors[currentIndex];
});

7. 이벤트와 함께 사용

기본 이벤트 리스너

<button id="btn">클릭</button>
const btn = document.getElementById('btn');

btn.addEventListener('click', function() {
    alert('버튼이 클릭되었습니다!');
});

여러 요소에 이벤트 추가

<button class="btn">버튼 1</button>
<button class="btn">버튼 2</button>
<button class="btn">버튼 3</button>
const buttons = document.querySelectorAll('.btn');

buttons.forEach(button => {
    button.addEventListener('click', function() {
        console.log(this.textContent + ' 클릭됨');
    });
});

주의사항

1. DOM 로드 대기

// ❌ 오류: DOM이 로드되기 전에 실행
const btn = document.getElementById('btn');

// ✅ 올바른 방법
document.addEventListener('DOMContentLoaded', function() {
    const btn = document.getElementById('btn');
    // ...
});

// 또는 스크립트를 </body> 앞에 배치

2. querySelector vs getElementById

// getElementById: 빠름, ID만 가능
const btn1 = document.getElementById('btn');

// querySelector: 유연함, CSS 선택자 사용 가능
const btn2 = document.querySelector('#btn');
const btn3 = document.querySelector('.button');

3. innerHTML 보안

// ❌ 위험: XSS 공격 가능
const userInput = '<script>alert("XSS")</script>';
element.innerHTML = userInput;

// ✅ 안전: textContent 사용
element.textContent = userInput;

연습 문제

  1. 텍스트 변경

    • 버튼을 클릭하면 제목의 텍스트가 변경되도록 하세요.
  2. 리스트 추가

    • 입력 필드에 텍스트를 입력하고 버튼을 클릭하면 리스트에 항목이 추가되도록 하세요.
  3. 이미지 변경

    • 버튼을 클릭할 때마다 이미지가 변경되도록 하세요.
  4. 스타일 변경

    • 버튼을 클릭하면 박스의 배경색이 변경되도록 하세요.
  5. 요소 제거

    • 리스트 항목을 클릭하면 해당 항목이 제거되도록 하세요.

다음 장 예고

다음 장에서는 이벤트(Event)에 대해 더 자세히 학습합니다.

'FrontEnd > Javascript' 카테고리의 다른 글

13장. 스코프와 호이스팅  (0) 2026.01.12
12장. 이벤트 (Event)  (0) 2026.01.11
10. 객체  (0) 2026.01.09
9. 배열  (0) 2026.01.09
8장. 함수  (0) 2026.01.08