Open Microfrontends는 Microfrontend 세계의 OpenAPI다. 자산, 설정, 메시지, API 프록시, 권한까지 하나의 스펙으로 정의해 타입 안전한 통합과 배포를 표준화한다.
Microfrontend를 Microservice처럼 기술하기 위한 공식 스펙
역할: OpenAPI가 Microservice에 하는 역할을, Microfrontend에 대해 수행
하나의 Description(명세) 파일로 다음을 선언:
핵심 목표:
Microfrontend “개발”과 “호스트 앱 통합”을 분리하고,
서버가 노출하는 Microfrontend를 다른 애플리케이션에서 표준화된 방식으로 소비하게 만드는 것.
YAML/JSON으로 작성:
$schema: 'https://open-microfrontends.org/schemas/1-0-0.json'
openMicrofrontends: 1.0.0
servers:
- url: 'http://localhost:7890'
description: Local Test Server
microfrontends:
- name: My First Microfrontend
assets:
basePath: /public
js:
moduleSystem: ESM
initial:
- Microfrontend.js
rendererFunctionName: startMyFirstMicrofrontend
config:
schema: ...
default: ...
messages:
ping:
publish: true
subscribe: true
schema: ...
여기서 Description이 정의하는 것:
에셋(assets)
설정(config)
schemadefault 값메시지(messages)
publish / subscribe 가능 여부(확장) userPermissions / apiProxies / securitySchemes
즉 Description은 Microfrontend가 “무엇을 필요로 하고, 무엇을 제공하는지”를 모두 문서화하는 계약 객체다.
Description만 쓰고 나면, OpenMicrofrontends Generator가 다음을 생성:
import {
MyFirstMicrofrontendRenderer,
MyFirstMicrofrontendRendererFunctionName,
} from './_generated/microfrontendsRenderers';
const renderer: MyFirstMicrofrontendRenderer = async (host, context) => {
const { config, messageBus } = context;
host.innerHTML = `
<div>
<h2>${config.welcomeMessage}</h2>
</div>
`;
const onPing = () => { /* ... */ };
// 타입 안전한 메시지 구독
messageBus.subscribe('ping', onPing);
return {
onRemove: () => {
host.innerHTML = '';
messageBus.unsubscribe('ping', onPing);
},
};
};
// 번들 방식에 따라 export 또는 window 할당
export default {
[MyFirstMicrofrontendRendererFunctionName]: renderer,
};
특징:
context.config가 JSON Schema 기반으로 바로 타입이 붙은 상태로 제공.messageBus.subscribe('ping', ...)는 Description의 messages.ping.schema와 연결되어 타입 안전.import { startMyFirstMicrofrontend } from './_generated/microfrontendStarters';
const hostElement = document.getElementById('root')!;
const { close, messages } = await startMyFirstMicrofrontend(
'https://my-microfrontend-server.com',
hostElement,
{
id: '1',
config: {
welcomeMessage: 'Microfrontend Demo!',
},
messageBus: globalMessageBus,
},
);
// 타입 안전한 메시지 발행
messages.publish('ping', { ping: true });
Host 개발자는:
더 복잡한 Description 예시:
securitySchemes (예: ApiKeyAuth)userPermissions (권한 목록 + Fetch 경로)apiProxies (BFF, 외부 서비스 등)Generator는 이에 맞춰:
import { MySecondMicrofrontendBaseSetup } from './_generated/microfrontendHostIntegrations';
export default class MySecondMicrofrontendBaseSetupImpl
implements MySecondMicrofrontendBaseSetup {
get microfrontendBaseUrl() {
return 'http://second-microfrontend...:8080';
}
async getUser(req) {
// 인증/세션에서 유저 로딩
return null;
}
async apiProxyRequestBffGetSecurityHeaders(req) {
return { 'x-api-key': '123456' };
}
get apiProxySomeExternalApiUrl() {
return 'http://my-service...:8080';
}
async userPermissionsRequestGetSecurityHeaders(req) {
return { 'x-api-key': '123456' };
}
}
import { mySecondMicrofrontendHostIntegrationMiddleware }
from './_generated/microfrontendHostIntegrations';
app.use(
mySecondMicrofrontendHostIntegrationMiddleware(
new MySecondMicrofrontendBaseSetupImpl(),
),
);
이렇게 하면:
Microfrontend 내부에서는:
const renderer: MySecondMicrofrontendRenderer = async (host, context) => {
const { config, apiProxyPaths, permissions } = context;
const canDelete = permissions.deleteCustomer; // boolean
const response = await fetch(
`${apiProxyPaths.bff}/customers/${config.customerId}`,
);
};
→ apiProxyPaths / permissions도 Description 기반 타입이 붙어 있다.
Open Microfrontends의 의미:
계약 우선(Contract-first) 개발
TypeScript 기반 타입 안전성
조직·플랫폼 관점의 이점
새로운 패러다임
요약하면, Open Microfrontends는:
Microfrontend 세계의 OpenAPI
- TypeScript 기반 타입 안전 코드 생성기
- Host/FE 통합을 표준화하는 계약 시스템
을 한 번에 제공하는 스펙이다.
원문 - Open Microfrontends