Shadow DOM 완전 정리: 웹 컴포넌트의 핵심 기술

2025. 5. 28. 10:11·Frontend Development
반응형

프론트엔드 개발에서 컴포넌트 기반 아키텍처가 중요해지면서, Shadow DOM의 중요성도 함께 커지고 있습니다. 이 글에서는 Shadow DOM의 개념부터 실제 사용 방법까지 자세히 알아보겠습니다.

이미지 출처 - https://www.ionos.com/digitalguide/websites/web-development/shadow-dom/


Shadow DOM이란?

Shadow DOM은 웹 컴포넌트(Web Components)의 핵심 기술 중 하나로, DOM 캡슐화를 가능하게 해주는 기능입니다. 쉽게 말해, 컴포넌트 내부의 DOM과 스타일을 외부로부터 격리시키는 기술입니다.

기본 개념

<host-element>
  #shadow-root (open)
    <style>
      p { color: red; }
    </style>
    <p>Hello Shadow DOM</p>
</host-element>

위 예시에서 볼 수 있듯이, Shadow DOM은 일반 DOM과 달리 Shadow Root를 가진 트리 구조를 가집니다. 이 구조를 통해 컴포넌트 내부의 스타일이 외부에 영향을 주지 않고, 외부 스타일도 컴포넌트에 영향을 주지 않게 됩니다.


Shadow DOM이 필요한 이유

1. 스타일 격리

  • 전역 CSS가 많아질수록 의도하지 않은 스타일 충돌 발생
  • 컴포넌트별로 독립적인 스타일 적용 가능
  • CSS-in-JS나 CSS Modules의 대안으로 사용 가능

2. 재사용성

  • 컴포넌트를 독립적으로 설계하고 배포 가능
  • 다른 프로젝트에서도 쉽게 재사용 가능
  • 버전 관리가 용이

3. 유지보수성

  • 복잡한 프로젝트에서도 컴포넌트 단위로 코드 관리
  • 스타일 충돌로 인한 버그 발생 가능성 감소
  • 컴포넌트의 책임과 역할이 명확해짐

Shadow DOM 사용 방법

기본 구현

class MyElement extends HTMLElement {
  constructor() {
    super();
    const shadow = this.attachShadow({ mode: 'open' });
    shadow.innerHTML = `
      <style>
        p { color: blue; font-weight: bold; }
      </style>
      <p>This is inside Shadow DOM</p>
    `;
  }
}

customElements.define('my-element', MyElement);

사용 예시

<my-element></my-element>

주요 메서드 설명

  1. attachShadow(): Shadow Root를 생성하는 메서드

    const shadow = this.attachShadow({ mode: 'open' });
  2. innerHTML: Shadow DOM에 직접 HTML 삽입

    shadow.innerHTML = `<p>Content</p>`;

Shadow DOM의 모드

Shadow DOM은 두 가지 모드를 제공합니다:

모드 설명 접근성
open 외부에서 element.shadowRoot로 접근 가능 element.shadowRoot로 접근 가능
closed 외부 접근 불가능 shadowRoot는 null 반환

closed 모드 예시

const shadow = this.attachShadow({ mode: 'closed' });
console.log(this.shadowRoot); // null

실제 사용 사례

1. 디자인 시스템

class CustomButton extends HTMLElement {
  constructor() {
    super();
    const shadow = this.attachShadow({ mode: 'open' });
    shadow.innerHTML = `
      <style>
        button {
          padding: 10px 20px;
          border: none;
          border-radius: 4px;
          background: #007bff;
          color: white;
          cursor: pointer;
        }
        button:hover {
          background: #0056b3;
        }
      </style>
      <button><slot></slot></button>
    `;
  }
}

customElements.define('custom-button', CustomButton);

2. 외부 서비스 통합

class AdWidget extends HTMLElement {
  constructor() {
    super();
    const shadow = this.attachShadow({ mode: 'closed' });
    shadow.innerHTML = `
      <style>
        .ad-container {
          width: 300px;
          height: 250px;
          border: 1px solid #ccc;
        }
      </style>
      <div class="ad-container">
        <!-- 광고 콘텐츠 -->
      </div>
    `;
  }
}

customElements.define('ad-widget', AdWidget);

주의사항

1. SEO 고려사항

  • 검색 엔진이 Shadow DOM 내부 콘텐츠를 인식하지 못할 수 있음
  • 중요한 콘텐츠는 일반 DOM에 배치하는 것이 좋음

2. 접근성(A11y)

  • 스크린 리더가 Shadow DOM 내부 요소를 제대로 인식하지 못할 수 있음
  • ARIA 속성을 적절히 사용하여 접근성 보장 필요

3. 디버깅

  • Shadow DOM 내부 요소는 개발자 도구에서 별도로 표시됨
  • 스타일 격리로 인한 디버깅이 어려울 수 있음

결론

Shadow DOM은 웹 컴포넌트 개발에서 필수적인 기술입니다. 특히 다음과 같은 상황에서 큰 장점을 발휘합니다:

  1. 독립적인 컴포넌트 개발: 스타일 충돌 없이 컴포넌트 개발 가능
  2. 재사용성 향상: 다른 프로젝트에서도 쉽게 재사용 가능
  3. 유지보수성 개선: 컴포넌트 단위로 코드 관리 용이

React, Vue, Svelte 등에서는 Shadow DOM을 직접 사용하지 않지만, Web Components 기반 프레임워크나 Vanilla JS에서는 중요한 기술입니다. 특히 디자인 시스템을 구축하거나 외부 영향 없이 안정적인 UI를 만들고자 할 때 큰 도움이 됩니다.


참고 자료

  • MDN Web Components
  • Web Components Specification
  • Shadow DOM v1: Self-Contained Web Components
반응형
저작자표시 비영리 변경금지 (새창열림)

'Frontend Development' 카테고리의 다른 글

React 라이프사이클과 Next.js: 차이점 완벽 가이드  (4) 2025.05.29
프론트엔드 상태 관리: Flux, Proxy, Atomic 패턴과 주요 라이브러리 비교  (4) 2025.05.28
Netflix의 아키텍처와 API 성능 최적화 전략  (0) 2025.05.28
React의 동시성 모드(Concurrent Mode): 사용자 경험을 혁신하는 비밀 무기  (0) 2025.05.28
script 태그의 성능 최적화: async와 defer 속성 완벽 가이드  (0) 2025.05.28
'Frontend Development' 카테고리의 다른 글
  • React 라이프사이클과 Next.js: 차이점 완벽 가이드
  • 프론트엔드 상태 관리: Flux, Proxy, Atomic 패턴과 주요 라이브러리 비교
  • Netflix의 아키텍처와 API 성능 최적화 전략
  • React의 동시성 모드(Concurrent Mode): 사용자 경험을 혁신하는 비밀 무기
Kun Woo Kim
Kun Woo Kim
안녕하세요, 김건우입니다! 웹과 앱 개발에 열정적인 전문가로, React, TypeScript, Next.js, Node.js, Express, Flutter 등을 활용한 프로젝트를 다룹니다. 제 블로그에서는 개발 여정, 기술 분석, 실용적 코딩 팁을 공유합니다. 창의적인 솔루션을 실제로 적용하는 과정의 통찰도 나눌 예정이니, 궁금한 점이나 상담은 언제든 환영합니다.
  • Kun Woo Kim
    WhiteMouseDev
    김건우
  • 깃허브
    포트폴리오
    velog
  • 전체
    오늘
    어제
  • 공지사항

    • [인사말] 이제 티스토리에서도 만나요! WhiteMouse⋯
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 분류 전체보기 (100) N
      • Frontend Development (39) N
      • Backend Development (21) N
      • Algorithm (33) N
        • 백준 (11) N
        • 프로그래머스 (17)
        • 알고리즘 (5)
      • Infra (1)
      • 자료구조 (3)
  • 링크

    • Github
    • Portfolio
    • Velog
  • 인기 글

  • 태그

    frontend development
    tailwindcss
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Kun Woo Kim
Shadow DOM 완전 정리: 웹 컴포넌트의 핵심 기술
상단으로

티스토리툴바