채널톡 코어웹팀이 여러 개의 React 인스턴스와 깨진 Context 문제를 추적하며 세운 기술 트러블슈팅 가이드
마이크로 프론트엔드 환경에서 Module Federation의 singleton 옵션을 적용하더라도 런타임 분리, 서브패스 매칭 미흡, 패키지 매니저의 peerDependency 해석 차이로 인해 인스턴스가 파편화될 수 있습니다. 본 아티클은 실제 프로덕션 환경에서 발생한 싱글톤 인스턴스 중복 문제를 근본적으로 분석하고 해결 기준을 정립한 여정을 담고 있습니다.
Module Federation 기반 마이크로 프론트엔드를 구축 중이거나, 원인 모를 React Hook/Context 에러로 고통받는 프론트엔드 아키텍트와 대규모 모노레포 관리자에게 강력 추천합니다.
마이크로 프론트엔드 전환 중 Module Federation(MF)을 도입하면서 React 훅 에러 및 컨텍스트(Context) 값이 초기화되는 문제가 발생했습니다. 이는 호스트와 리모트 번들, 또는 호스트 내부의 다중 진입점(entry)으로 인해 동일한 라이브러리 인스턴스가 런타임 모듈 캐시상에서 여러 벌 생성되었기 때문입니다.
Webpack의 shared singleton 옵션을 설정하고, runtimeChunk: 'single'을 적용해 호스트의 런타임을 하나로 합쳤습니다. 또한 서브패스(subpath)를 shared 키에 명시적으로 추가하고, pnpm 카탈로그를 활용해 peerDependency 버전 불일치로 인한 인스턴스 중복 생성을 방지했습니다.
단일 인스턴스 참조가 보장되어 훅 에러와 컨텍스트 유실 문제를 해결했으며, 리모트가 호스트 인스턴스를 직접 참조해야 하는 경우에만 싱글톤으로 등록하는 명확한 기술 판단 기준을 세웠습니다.
Trade-off
eager: true 및 싱글톤 처리된 패키지는 트리쉐이킹(tree-shaking)이 적용되지 않아 초기 번들 용량이 증가할 수 있으므로, React Query처럼 감싼 훅으로 우회 가능한 라이브러리는 무조건 공유 대상에 포함하지 않는 타협이 필요합니다.
모듈 페더레이션 환경에서 호스트와 리모트 번들이 특정 라이브러리의 단일 인스턴스만을 공통으로 참조하도록 보장하는 Webpack 설정입니다.
Webpack 빌드 시 각 진입점(entry)마다 별도로 생성되는 런타임 코드와 모듈 캐시를 단일 청크로 추출해 통합하는 기법입니다.
Module Federation의 shared 키가 단순 패키지명이 아니라 자바스크립트 import 요청 경로 서브패스 문자열을 기준으로 매칭되는 동작 방식입니다.