원문 제목: Under the hood of MDN's new frontend 원문 링크: https://developer.mozilla.org/en-US/blog/mdn-front-end-deep-dive/ 번역일: 2026-04-19 KST
MDN은 작년에 새 프론트엔드를 공개했지만, 눈에 띄는 변화는 디자인 통일 정도였고 진짜 큰 변화는 내부 코드 구조였다. 이 글은 왜 MDN이 프론트엔드를 다시 만들었는지, 어떤 기술을 골랐는지, 그리고 그 선택이 어떤 문제를 해결했는지를 설명한다.
기존 MDN 구조를 단순화하면 이렇다. 문서는 여러 Git 저장소의 Markdown으로 관리되고, 빌드 도구가 이를 HTML과 메타데이터가 포함된 JSON으로 바꾼다. 이후 프론트엔드가 이 JSON을 읽어 브라우저 호환성 표, 다국어 처리, 네비게이션 등을 포함한 완성 페이지로 조립하고, 최종 HTML/CSS/JS를 클라우드에 올려 전 세계 사용자에게 배포한다.
문제는 예전 프론트엔드인 yari가 React 앱으로 시작했지만 시간이 지나며 기술 부채가 크게 쌓였다는 점이다. Create React App 기반으로 시작했지만 기본 설정이 맞지 않아 점점 우회 코드가 추가됐고, 결국 eject 이후 매우 복잡한 Webpack 설정과 해키한 빌드 스크립트가 남았다. CSS 쪽도 Sass와 CSS 변수, 전역적으로 얽힌 스타일, 빈약한 스코프 관리 때문에 한 컴포넌트를 수정하면 다른 곳이 깨지는 일이 잦았다. 그 결과 사용자는 자신이 보지 않을 컴포넌트 스타일까지 포함된 큰 렌더 차단 CSS를 받아야 했다.
가장 큰 문제는 React 앱이 실제 문서 콘텐츠를 이해하지 못하는 ‘껍데기’였다는 점이다. 빌드된 HTML 콘텐츠를 React가 다루게 하려면 다시 파싱하고 많은 로직을 클라이언트 번들에 실어야 했다. MDN은 이를 피하기 위해 dangerouslySetInnerHTML로 문서 HTML을 주입했다. 그러다 보니 코드 블록 복사 버튼 같은 상호작용은 React 바깥의 순수 DOM API로 구현해야 했고, 경우에 따라 React 버전과 DOM API 버전을 둘 다 유지해야 했다.
이 문제를 풀기 위해 MDN 팀은 2024년부터 Lit과 Web Components를 실험했다. 첫 성공 사례는 Scrimba 학습 콘텐츠를 삽입하는 ‘Scrim’ 컴포넌트였다. 사용자가 실제로 열기 전까지 iframe을 로드하지 않고, dialog 요소로 풀스크린 동작도 제어해야 했는데, Lit 기반 커스텀 엘리먼트로 구현하니 JSX에 가까운 템플릿 문법과 상태 기반 갱신을 쓰면서도 문서 콘텐츠 안에 바로 삽입할 수 있었다.
이후 더 복잡한 인터랙티브 예제 시스템도 같은 방향으로 옮겼다. 기존에는 예제 코드와 렌더링 로직이 네 개의 저장소에 흩어져 있었고, 작성자 입장에서도 수정과 디버깅이 번거로웠다. 새 구조에서는 CodeMirror 기반 에디터, 콘솔 출력, 미리보기 렌더러, 상태 전달 컨트롤러를 각각 커스텀 엘리먼트로 쪼갰다. 덕분에 문서 안의 코드 블록을 직접 읽어 인터랙티브 예제로 연결할 수 있게 됐고, 작성 경험도 훨씬 단순해졌다.
하지만 MDN의 재구축은 인터랙티브 조각만의 문제가 아니었다. React SPA 모델은 정적인 콘텐츠도 결국 클라이언트에서 다시 렌더링하기 위해 큰 JS 번들을 내려보내야 한다. MDN 팀은 React Server Components가 이 문제를 푸는 방향이라고 인정하면서도, 이를 제대로 쓰려면 현재 구조와 맞지 않는 프레임워크로 크게 이주해야 한다고 봤다. 대신 MDN은 사이트 성격 자체를 다시 정의했다. MDN 대부분은 정적인 문서와 코드 예제이고, 상호작용은 ‘섬’처럼 일부에만 존재한다. 그렇다면 페이지 전체를 하나의 SPA로 둘 이유가 없고, 필요한 부분만 웹 컴포넌트로 두면 된다.
그래서 MDN은 서버 템플릿도 자체적인 ‘서버 컴포넌트’ 개념으로 정리했다. Lit의 HTML 템플릿 리터럴을 서버에서도 활용해 네비게이션, 메뉴, 검색 UI 같은 정적 구조를 컴포넌트 단위로 조립했다. 이 방식은 클라이언트에 불필요한 로직을 보내지 않으면서도, 컴포넌트 단위 스타일링과 조립의 장점을 유지할 수 있었다.
결국 새 구조는 세 가지 문제를 한 번에 해결했다. 정적인 콘텐츠를 위해 거대한 SPA 번들을 보내지 않아도 되고, 문서 HTML을 이해하지 못하는 ‘래퍼 앱’ 문제도 사라졌으며, 각 인터랙션은 필요한 곳에서만 로드되는 독립적인 웹 컴포넌트가 되었다. MDN이 내린 결론은 분명하다. 콘텐츠 중심 사이트라면 앱처럼 다 만들 필요가 없고, 정적 렌더링과 작은 상호작용 섬의 조합이 더 단순하고 더 빠를 수 있다.