MFE 간 공유 상태와 라우팅
마이크로 프런트엔드 간에 전역 이벤트 버스 또는 컨텍스트를 공유하고 클라이언트 측 라우팅을 조정합니다.
MFE 간 공유 상태와 라우팅은(는) CoddyKit의 무료 React Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 React Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. React Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
상태 공유의 과제
서로 다른 번들에 있는 마이크로 프런트엔드는 React 상태나 컨텍스트를 직접 공유할 수 없습니다. 따라서 사용자 지정 이벤트, 공유 저장소, 주소, 게시/구독 이벤트 버스와 같은 대체 전략이 필요합니다.
브라우저 사용자 지정 이벤트
브라우저의 CustomEvent API를 간단한 이벤트 버스로 사용하면 마이크로 프런트엔드를 서로 결합하지 않고 통신할 수 있습니다.
// Remote emits:
window.dispatchEvent(new CustomEvent('cart:add', { detail: { productId: '123' } }));
// Host listens:
useEffect(() => {
const handler = (e: CustomEvent) => addToCart(e.detail.productId);
window.addEventListener('cart:add', handler);
return () => window.removeEventListener('cart:add', handler);
}, []);공유 이벤트 버스 라이브러리
Module Federation이나 주소로 로드한 싱글턴을 통해 공유하는 작은 게시/구독 라이브러리는 모든 MFE에서 사용할 수 있는 타입 지정 이벤트 버스를 제공합니다.
// Singleton event bus
const bus = {
listeners: new Map<string, Function[]>(),
emit(event: string, data: unknown) {
this.listeners.get(event)?.forEach(fn => fn(data));
},
on(event: string, fn: Function) {
if (!this.listeners.has(event)) this.listeners.set(event, []);
this.listeners.get(event)!.push(fn);
return () => this.off(event, fn);
},
off(event: string, fn: Function) {
const list = this.listeners.get(event) || [];
this.listeners.set(event, list.filter(f => f !== fn));
},
};
export default bus;공유 상태로 사용하는 웹 주소
웹 주소(경로 + 쿼리 매개변수)는 모든 MFE에서 자연스럽게 공유됩니다. 선택한 항목, 활성 탭, 필터 값과 같은 탐색 상태에 활용하세요.
// Remote reads from URL:
const params = new URLSearchParams(window.location.search);
const productId = params.get('product');
// Remote navigates via history API (or exposes a navigate callback from host):
window.history.pushState({}, '', '/products?product=456');라우팅 아키텍처
일반적으로 셸/호스트 애플리케이션이 최상위 라우터를 소유합니다. 리모트 마이크로 프런트엔드는 현재 경로와 navigate 콜백을 속성으로 전달받습니다.
// Host passes routing control to remote:
<RemoteProductsApp
basepath="/products"
navigate={(path) => router.push(path)}
/>
// Remote uses basepath for its internal router:
<BrowserRouter basename={basepath}>
<Routes>...</Routes>
</BrowserRouter>Module Federation에서 React Router 사용
각 MFE는 기본 경로를 기준으로 자체 React Router를 실행할 수 있습니다. 호스트 라우터는 최상위 탐색을 처리하고, 각 리모트는 하위 탐색을 독립적으로 처리합니다.
// Remote App component:
export function ProductsApp({ basepath = '/products' }) {
return (
<BrowserRouter basename={basepath}>
<Routes>
<Route path="/" element={<ProductList />} />
<Route path="/:id" element={<ProductDetail />} />
</Routes>
</BrowserRouter>
);
}공유 인증 상태
인증 상태(사용자, 토큰)는 일반적으로 셸이 소유하고 속성으로 리모트에 전달하거나 공유 싱글턴 저장소를 통해 노출합니다.
// Host provides auth via props:
<RemoteCheckout
userId={currentUser.id}
token={accessToken}
onLogout={handleLogout}
/>공유 저장소로 사용하는 Zustand
Module Federation을 통해 Zustand 저장소를 싱글턴으로 공유하면 모든 MFE가 메모리에서 동일한 저장소 인스턴스의 데이터를 읽습니다.
// shared/store.ts (exposed as singleton)
import { create } from 'zustand';
export const useCartStore = create(set => ({
items: [],
addItem: (item) => set(state => ({ items: [...state.items, item] })),
}));
// Configured as singleton in MF shared configMFE 간 통신의 잘못된 설계 패턴
깊게 중첩된 콜백 체인, 내부 구성 요소 상태 공유, 다른 MFE의 내부 API에 대한 강한 결합은 피하세요. 통신은 큰 단위의 이벤트와 공개 계약으로 제한하세요.
MFE 간 상호 작용 테스트
이벤트 계약(이벤트 이름과 데이터 형태)은 사용자 인터페이스와 별도로 테스트하세요. 계약 테스트를 사용해 생산자와 소비자가 이벤트 스키마에 동의하는지 확인하세요.
빠른 확인
여러 마이크로 프런트엔드 사이에서 결합 없이 탐색 상태나 필터 상태를 공유하는 가장 간단한 방법은 무엇인가요?
복습
사용자 지정 이벤트, 싱글턴 이벤트 버스, 웹 주소 또는 공유 저장소(Zustand/싱글턴)를 통해 MFE 사이에서 상태를 공유하세요. 셸은 최상위 라우터를 소유하고 기본 경로와 navigate를 리모트에 전달합니다. MFE 간 계약은 큰 단위로 정의하고 타입을 명확하게 지정하세요.
자주 묻는 질문
“MFE 간 공유 상태와 라우팅” 강의는 무료인가요?
네 — “MFE 간 공유 상태와 라우팅” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 React Academy 강의 전체를 잠금 해제할 수 있습니다. React Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“MFE 간 공유 상태와 라우팅”에서 뭘 배우나요?
마이크로 프런트엔드 간에 전역 이벤트 버스 또는 컨텍스트를 공유하고 클라이언트 측 라우팅을 조정합니다. 브라우저에서 직접 실행하는 실습 코드로 React Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
React Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 React Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“MFE 간 공유 상태와 라우팅” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 React Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 React Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.