FEInterview Prep

browser · medium priority

Web Components

Custom Elements, Shadow DOM, 프레임워크 독립 컴포넌트

intermediate 난이도3시간네이버카카오라인
시작 전
이해도
매우 낮음

학습 개요

탄생 배경

쉬운 설명

복잡한 개념을 실생활 비유로 설명합니다.

LEGO 블록

Web Components는 브라우저에 내장된 LEGO 블록 시스템입니다. 직접 새로운 HTML 태그(my-button, app-card)를 정의할 수 있고, Shadow DOM은 각 블록을 별도 상자에 넣어 외부 스타일이 침범하지 못하게 보호합니다. 어떤 프레임워크로 만든 페이지에도 블록을 꽂을 수 있습니다.

핵심 개념

Custom Element 생명주기javascript
1class MyButton extends HTMLElement {
2 constructor() {
3 super();
4 // Shadow DOM 생성 (mode: 'open' | 'closed')
5 this.attachShadow({ mode: 'open' });
6 }
7
8 // 관찰할 속성 목록 (이 속성 변경 시 attributeChangedCallback 호출)
9 static get observedAttributes() {
10 return ['label', 'disabled'];
11 }
12
13 // DOM에 추가됐을 때 (React의 componentDidMount)
14 connectedCallback() {
15 this.render();
16 }
17
18 // DOM에서 제거됐을 때 (React의 componentWillUnmount)
19 disconnectedCallback() {
20 this.cleanup();
21 }
22
23 // 속성 변경 시 (React의 componentDidUpdate)
24 attributeChangedCallback(name, oldVal, newVal) {
25 if (oldVal !== newVal) this.render();
26 }
27
28 render() {
29 const button = document.createElement('button');
30 button.textContent = this.getAttribute('label') || 'Click';
31 if (this.hasAttribute('disabled')) button.disabled = true;
32
33 const style = document.createElement('style');
34 style.textContent = 'button { padding: 8px 16px; border-radius: 4px; }';
35
36 this.shadowRoot.replaceChildren(style, button);
37 }
38}
39
40// 커스텀 태그 등록
41customElements.define('my-button', MyButton);
42
43// HTML에서 사용
44// <my-button label="저장" disabled></my-button>

Lit 라이브러리

구글이 만든 Web Components 라이브러리. 보일러플레이트를 줄여주고, 리액티브 속성, 템플릿 리터럴 기반 렌더링을 제공합니다.

실무 적용

어떤 상황에서 사용하는가

여러 팀이 다른 프레임워크(React, Vue, Angular)를 사용할 때 공통 UI 컴포넌트를 공유해야 하는 상황

어떻게 적용하는가

마이크로 프론트엔드에서 팀 간 공유 UI 컴포넌트, 또는 CMS 위젯으로 활용. Lit 라이브러리로 개발 생산성 향상. Google Material Web Components, Adobe Spectrum 같은 디자인 시스템이 이 방식 사용.

흔한 실수와 안티패턴

  • SSR 지원 어려움 — 브라우저 API 의존으로 Next.js 서버 렌더링 불가
  • React 생태계(Context, hooks)와의 통합이 복잡
  • TypeScript 지원을 위해 추가 타입 선언 파일 필요

면접 질문

중급네이버카카오

답변 방향 힌트

스타일 캡슐화

반드시 언급할 키워드

  • 스타일 격리
  • 외부 CSS 영향 차단
  • 내부 구현 은닉

예상 꼬리 질문

  • Lit 라이브러리를 사용해본 경험이 있나요?
  • React와 Web Components를 함께 사용하는 방법은?

학습 자료