0Pricing
JavaScript Academy · 강의

Shadow DOM과 캡슐화

Shadow Root 안에서 스타일과 마크업을 격리합니다.

Shadow DOM과 캡슐화은(는) CoddyKit의 무료 JavaScript Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 JavaScript Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. JavaScript Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

Shadow DOM이란 무엇인가

Shadow DOM을 사용하면 요소에 비공개로 캡슐화된 DOM 트리를 만들 수 있습니다. 그 안의 마크업과 스타일은 페이지의 나머지 부분과 격리됩니다.

  • 외부 CSS가 내부로 스며들지 않습니다.
  • 내부 CSS가 외부로 새어 나가지 않습니다.
  • 일반적인 DOM 쿼리로는 내부 구조가 숨겨집니다.

attachShadow

this.attachShadow({ mode: 'open' })을 호출하여 섀도 트리를 만듭니다. 이 호출은 일반 노드처럼 내용을 채울 수 있는 섀도 root를 반환합니다.

class FancyBox extends HTMLElement {
  constructor() {
    super();
    this.attachShadow({ mode: 'open' });
  }
}
customElements.define('fancy-box', FancyBox);

열린 모드와 닫힌 모드

mode 옵션은 외부에서의 접근을 제어합니다.

  • 'open' — element.shadowRoot를 통해 root에 접근할 수 있습니다.
  • 'closed' — element.shadowRoot가 null을 반환하며, 참조는 사용자 코드만 보유합니다.

대부분의 구성 요소는 디버깅이 더 쉽도록 'open'을 사용합니다.

const root = this.attachShadow({ mode: 'open' });
// Later, from outside:
// myEl.shadowRoot  -> the shadow root (open)
// closed mode would give null here

섀도 root 채우기

shadowRoot.innerHTML을 설정하여 캡슐화된 콘텐츠를 구성합니다. 이 마크업은 document.querySelector에서 보이지 않습니다.

class FancyBox extends HTMLElement {
  constructor() {
    super();
    const root = this.attachShadow({ mode: 'open' });
    root.innerHTML = '<p>I live inside the shadow DOM</p>';
  }
}
customElements.define('fancy-box', FancyBox);

범위가 지정된 스타일

섀도 root 내부의 style 태그는 해당 root에만 영향을 줍니다. 구성 요소 외부의 동일한 선택자는 영향을 받지 않으며 페이지의 스타일도 내부로 스며들지 않습니다.

root.innerHTML =
  '<style>p { color: rebeccapurple; }</style>' +
  '<p>Only this paragraph is purple.</p>';
// A <p> elsewhere on the page is NOT affected.

:host 선택자

섀도 스타일 내부에서 :host는 사용자 지정 요소 자체, 즉 섀도 트리의 호스트를 대상으로 합니다. 이를 사용하여 구성 요소의 외부 상자를 스타일링하세요.

root.innerHTML =
  '<style>' +
  ':host { display: block; border: 1px solid gray; }' +
  ':host(.active) { border-color: green; }' +
  '</style>' +
  '<slot></slot>';

스타일 격리의 효과

캡슐화를 사용하면 구성 요소 작성자와 페이지 작성자가 클래스 이름을 두고 충돌하지 않아도 됩니다. 한 구성 요소 내부의 .title 규칙은 다른 곳의 .title에 절대 영향을 주지 않습니다.

  • 전역 CSS 충돌이 없습니다.
  • 단순하고 일반적인 선택자를 다시 안전하게 사용할 수 있습니다.

섀도 root 내부 쿼리하기

내부 노드에 접근하려면 문서가 아니라 섀도 root를 대상으로 쿼리하세요. 섀도 root는 동일한 쿼리 메서드를 지원합니다.

class ToggleButton extends HTMLElement {
  constructor() {
    super();
    const root = this.attachShadow({ mode: 'open' });
    root.innerHTML = '<button>Off</button>';
    this.btn = root.querySelector('button');
  }
}
customElements.define('toggle-button', ToggleButton);

이벤트는 경계를 넘습니다

click과 같은 많은 이벤트는 Shadow DOM 밖으로 버블링되지만 대상이 다시 지정되어 외부 리스너에는 내부 노드가 아닌 호스트 요소가 표시됩니다. 이렇게 하면 캡슐화가 유지됩니다.

// Outside listener sees event.target as <toggle-button>,
// not the inner <button>.
document.querySelector('toggle-button')
  .addEventListener('click', e => {
    console.log(e.target.tagName); // TOGGLE-BUTTON
  });

상속되는 스타일

color와 font-family 같은 일부 CSS 속성은 상속이 구성된 트리를 따라 흐르기 때문에 섀도 경계를 넘어 상속됩니다. 상속에 의존하거나 CSS 사용자 지정 속성을 사용하면 페이지의 디자인을 따르도록 할 수 있습니다.

// :host { color: inherit; }
// CSS custom properties also pierce the boundary:
// :host { color: var(--text-color, black); }

Shadow DOM을 사용해야 하는 경우

재사용 가능한 위젯에 강력한 스타일 및 마크업 격리가 필요하다면 Shadow DOM을 사용하세요. 구성 요소가 페이지의 전역 스타일을 자유롭게 상속하고 그 일부로 동작해야 한다면 사용하지 않는 편이 좋습니다.

빠른 확인

Shadow DOM에 대한 이해도를 확인해 보세요.

복습

Shadow DOM에 대해 배웠습니다.

  • attachShadow({ mode })는 격리된 트리를 만듭니다.
  • 'open'은 shadowRoot를 노출하고, 'closed'는 숨깁니다.
  • 내부 style 태그에는 범위가 지정되며, :host는 요소 자체의 스타일을 지정합니다.
  • 쿼리는 문서가 아니라 섀도 root를 대상으로 실행됩니다.
  • 캡슐화를 유지하기 위해 이벤트의 대상이 다시 지정됩니다.

다음으로 템플릿과 슬롯을 사용하여 마크업을 재사용하겠습니다.

자주 묻는 질문

“Shadow DOM과 캡슐화” 강의는 무료인가요?

네 — “Shadow DOM과 캡슐화” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 JavaScript Academy 강의 전체를 잠금 해제할 수 있습니다. JavaScript Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“Shadow DOM과 캡슐화”에서 뭘 배우나요?

Shadow Root 안에서 스타일과 마크업을 격리합니다. 브라우저에서 직접 실행하는 실습 코드로 JavaScript Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

JavaScript Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 JavaScript Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.

“Shadow DOM과 캡슐화” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 JavaScript Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 JavaScript Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 사용자 지정 요소 정의하기
  2. 수명 주기 콜백
  3. Shadow DOM과 캡슐화
  4. 템플릿과 슬롯
← JavaScript Academy(으)로 돌아가기