JavaScript/DOM 조작

DOM이란? 기본 개념 - JavaScript로 웹페이지 조작하기

코딩하는 패션이과생 2025. 6. 24. 22:17
반응형

DOM이란?

DOM(Document Object Model)은 HTML 문서를 JavaScript로 조작할 수 있게 해주는 인터페이스입니다. 브라우저가 HTML을 읽어서 만든 객체 모델로, 웹페이지의 모든 요소를 객체로 표현합니다.

🔍 DOM의 역할

<!-- HTML 문서 -->
<html>
  <body>
    <h1 id="title">안녕하세요!</h1>
    <p class="content">DOM을 배워봅시다.</p>
  </body>
</html>
// JavaScript로 DOM 조작
document.getElementById('title').textContent = '제목 변경!';
document.querySelector('.content').style.color = 'red';

DOM을 통해 HTML 요소의 내용, 스타일, 속성을 자유롭게 변경할 수 있습니다.


DOM 트리 구조

DOM은 HTML 문서를 트리 구조로 표현합니다. 각 HTML 요소는 노드(Node)가 됩니다.

HTML 구조

<!DOCTYPE html>
<html>
  <head>
    <title>DOM 예제</title>
  </head>
  <body>
    <div id="container">
      <h1>제목</h1>
      <p>내용</p>
      <ul>
        <li>항목 1</li>
        <li>항목 2</li>
      </ul>
    </div>
  </body>
</html>

DOM 트리 구조

document
└── html
    ├── head
    │   └── title
    │       └── "DOM 예제"
    └── body
        └── div#container
            ├── h1
            │   └── "제목"
            ├── p
            │   └── "내용"
            └── ul
                ├── li
                │   └── "항목 1"
                └── li
                    └── "항목 2"

주요 노드 타입

  • Document: 문서 전체 (document)
  • Element: HTML 태그 (div, p, h1 등)
  • Text: 텍스트 내용
  • Attribute: 요소의 속성 (id, class 등)

DOM 요소 선택하기

JavaScript로 DOM 요소를 조작하려면 먼저 해당 요소를 선택해야 합니다.

기본 선택 메서드

// ID로 선택 (하나만 반환)
let title = document.getElementById('title');

// 클래스로 선택 (여러 개 반환)
let items = document.getElementsByClassName('item');

// 태그로 선택 (여러 개 반환)
let paragraphs = document.getElementsByTagName('p');

// CSS 선택자로 선택 (첫 번째만 반환)
let firstItem = document.querySelector('.item');

// CSS 선택자로 모두 선택 (NodeList 반환)
let allItems = document.querySelectorAll('.item');

실무에서 자주 사용하는 선택 방법

<div class="container">
  <h1 id="main-title">제목</h1>
  <p class="description">설명</p>
  <button class="btn primary">클릭</button>
</div>
// ID 선택 (가장 빠름)
let title = document.getElementById('main-title');

// 클래스 선택
let description = document.querySelector('.description');

// 복합 선택자
let primaryButton = document.querySelector('.btn.primary');

// 자식 요소 선택
let containerTitle = document.querySelector('.container h1');

// 모든 버튼 선택
let allButtons = document.querySelectorAll('button');

DOM 조작하기

선택한 요소의 내용, 스타일, 속성을 변경할 수 있습니다.

1. 내용 변경

let title = document.getElementById('title');

// 텍스트 내용 변경
title.textContent = '새로운 제목';

// HTML 내용 변경
title.innerHTML = '<strong>굵은 제목</strong>';

console.log(title.textContent); // "굵은 제목"
console.log(title.innerHTML);   // "<strong>굵은 제목</strong>"

2. 스타일 변경

let element = document.querySelector('.box');

// 개별 스타일 변경
element.style.color = 'red';
element.style.backgroundColor = 'yellow';
element.style.fontSize = '20px';

// 여러 스타일 한 번에 변경
element.style.cssText = 'color: blue; font-size: 18px; margin: 10px;';

3. 클래스 조작

let button = document.querySelector('.btn');

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

// 클래스 제거
button.classList.remove('disabled');

// 클래스 토글 (있으면 제거, 없으면 추가)
button.classList.toggle('hidden');

// 클래스 존재 확인
if (button.classList.contains('active')) {
    console.log('버튼이 활성화되어 있습니다.');
}

4. 속성 조작

let image = document.querySelector('img');

// 속성 설정
image.setAttribute('src', 'new-image.jpg');
image.setAttribute('alt', '새로운 이미지');

// 속성 가져오기
let imageSrc = image.getAttribute('src');

// 속성 제거
image.removeAttribute('title');

// 직접 속성 접근
image.src = 'another-image.jpg';

실무 활용 예제

1. 동적 콘텐츠 업데이트

<div id="user-info">
  <h2 id="username">사용자명</h2>
  <p id="email">이메일</p>
  <span id="status" class="offline">오프라인</span>
</div>
// 사용자 정보 업데이트 함수
function updateUserInfo(userData) {
    document.getElementById('username').textContent = userData.name;
    document.getElementById('email').textContent = userData.email;

    let statusElement = document.getElementById('status');
    statusElement.textContent = userData.isOnline ? '온라인' : '오프라인';
    statusElement.className = userData.isOnline ? 'online' : 'offline';
}

// 사용 예제
updateUserInfo({
    name: '김철수',
    email: 'kim@example.com',
    isOnline: true
});

2. 이벤트 처리

<button id="toggle-btn">모드 변경</button>
<div id="content" class="light-mode">내용</div>
let toggleButton = document.getElementById('toggle-btn');
let content = document.getElementById('content');

toggleButton.addEventListener('click', function() {
    // 다크 모드 토글
    content.classList.toggle('dark-mode');
    content.classList.toggle('light-mode');

    // 버튼 텍스트 변경
    if (content.classList.contains('dark-mode')) {
        toggleButton.textContent = '라이트 모드';
    } else {
        toggleButton.textContent = '다크 모드';
    }
});

3. 동적 요소 생성

// 새로운 요소 생성 함수
function createTodoItem(text) {
    // 요소 생성
    let li = document.createElement('li');
    let span = document.createElement('span');
    let deleteBtn = document.createElement('button');

    // 내용 설정
    span.textContent = text;
    deleteBtn.textContent = '삭제';
    deleteBtn.className = 'delete-btn';

    // 이벤트 추가
    deleteBtn.addEventListener('click', function() {
        li.remove();
    });

    // 요소 조립
    li.appendChild(span);
    li.appendChild(deleteBtn);

    return li;
}

// 사용 예제
let todoList = document.getElementById('todo-list');
let newItem = createTodoItem('DOM 공부하기');
todoList.appendChild(newItem);

4. 폼 검증

<form id="signup-form">
  <input type="email" id="email" placeholder="이메일">
  <input type="password" id="password" placeholder="비밀번호">
  <button type="submit">가입하기</button>
  <div id="error-message"></div>
</form>
let form = document.getElementById('signup-form');
let errorDiv = document.getElementById('error-message');

form.addEventListener('submit', function(event) {
    event.preventDefault(); // 기본 제출 동작 방지

    let email = document.getElementById('email').value;
    let password = document.getElementById('password').value;

    // 검증
    if (!email.includes('@')) {
        showError('올바른 이메일을 입력하세요.');
        return;
    }

    if (password.length < 6) {
        showError('비밀번호는 6자 이상이어야 합니다.');
        return;
    }

    showSuccess('가입이 완료되었습니다!');
});

function showError(message) {
    errorDiv.textContent = message;
    errorDiv.style.color = 'red';
}

function showSuccess(message) {
    errorDiv.textContent = message;
    errorDiv.style.color = 'green';
}

마무리

DOM은 JavaScript로 웹페이지를 동적으로 조작할 수 있게 해주는 핵심 개념입니다. DOM을 이해하면 정적인 HTML을 사용자와 상호작용하는 웹 애플리케이션으로 만들 수 있습니다.

DOM 조작을 마스터하면 사용자 친화적인 인터랙티브 웹 애플리케이션을 만들 수 있습니다!