마이크로 앱들이 서로 독립적이라 하더라도, 공통으로 사용하는 라이브러리(React, lodash 등)나 컴포넌트(디자인 시스템의 버튼 등)가 있을 수 있습니다.
이런 공유 자원을 각 마이크로 앱마다 중복해서 포함하면 전체 애플리케이션의 크기가 불필요하게 커집니다.
Webpack 5 버전부터 도입된
Module Federation은 별도로 빌드된 여러 개의 JavaScript 애플리케이션(번들)이
런타임
에 코드를 동적으로 공유할 수 있게 해줍니다.
Host
다른 애플리케이션(Remote)의 코드를 가져와 사용하는 애플리케이션입니다.
마이크로 프론트엔드에서는 보통 전체 앱을 감싸는 컨테이너 앱(셸 앱)이 호스트 역할을 합니다.
Remote
자신의 코드를 다른 애플리케이션(Host)에게 노출(expose)하는 애플리케이션입니다.
각 마이크로 앱이 리모트 역할을 할 수 있습니다.
Shared Dependencies
여러 애플리케이션(Host, Remote) 간에 공유할 의존성(라이브러리)입니다.
Module Federation은 설정된 공유 의존성을 버전까지 고려하여 중복 로드를 방지하고 효율적으로 관리해 줍니다.
예를 들어, Host와 Remote가 모두 React v18을 사용한다면, 브라우저에는 React v18 코드가 한 번만 로드됩니다.
Exposed Modules
Remote 애플리케이션이 Host에게 제공하기로 결정한 특정 모듈(컴포넌트, 함수 등)입니다.
이 설정을 통해 containerApp은 profileApp이 노출한 UserProfile 컴포넌트를 마치 자신의 코드인 것처럼 가져와 사용할 수 있으며, React와 같은 공유 라이브러리는 중복 로드되지 않습니다.
Q: "Webpack Module Federation이란 무엇이고 마이크로 프론트엔드에서 어떤 문제를 해결하나요?"
A: "독립적으로 빌드된 여러 웹팩 애플리케이션이 런타임에 코드를 동적으로 공유하는 기능입니다. MFE에서 마이크로 앱 간의 컴포넌트 공유나 공통 라이브러리 중복 로드 문제를 효율적으로 해결합니다."
마이크로 프론트엔드는 많은 장점을 제공하지만, 도입과 운영에 따르는 복잡성과 고려사항들도 있습니다.
초기 설정 복잡성
Module Federation, Single-SPA 등 관련 도구 설정 및 통합 환경 구축에 초기 노력이 필요합니다.
기술 스택 관리
이론적으로는 다양한 기술 스택을 사용할 수 있지만, 너무 많은 다양성은 개발자 경험 저하, 빌드/배포 복잡성 증가, 번들 크기 증가 등의 문제를 야기할 수 있습니다. 적절한 수준의 기술 스택 통일성 또는 가이드라인이 필요합니다.
공유 의존성 버전 관리
여러 마이크로 앱에서 사용하는 공유 라이브러리의 버전을 일관되게 관리하는 전략이 필요합니다. Module Federation이 도움을 주지만, 여전히 주의 깊은 관리가 필요합니다.
UI/UX 일관성
여러 팀이 독립적으로 개발하다 보면 전체적인 UI/UX 일관성이 깨지기 쉽습니다. 공유 디자인 시스템(라이브러리 형태 권장) 구축 및 적용이 매우 중요합니다.
상태 관리 및 앱 간 통신
마이크로 앱 간에 상태를 공유하거나 서로 통신해야 하는 경우, 명확한 인터페이스 정의와 통신 방법(예: Custom Events, window 객체, 라우터 상태, 전역 상태 라이브러리 활용 등)을 결정해야 합니다. 이는 MFE에서 가장 어려운 부분 중 하나일 수 있습니다.
팀 경계 설정
어떤 기준으로 마이크로 앱(과 팀)을 나눌 것인지 신중하게 결정해야 합니다. 비즈니스 도메인, 사용자 여정, 기능 등을 기준으로 나눌 수 있으며, 팀 간의 의존성을 최소화하는 방향으로 설계하는 것이 좋습니다.
독립적인 배포 파이프라인
각 마이크로 앱이 독립적으로 빌드, 테스트, 배포될 수 있는 CI/CD 파이프라인 구축이 필수적입니다.
운영 및 모니터링 복잡성
여러 개의 배포 단위를 관리하고 모니터링해야 하므로 운영 복잡성이 증가할 수 있습니다.
Module Federation은 내부적으로 의존성 그래프를 사용하여 공유 모듈과 버전을 관리합니다. Single-SPA는 라우팅 테이블(해시 테이블 유사 구조)을 사용하여 URL과 마이크로 앱을 매핑할 수 있습니다.
오늘은 대규모 프론트엔드 애플리케이션 개발의 복잡성을 해결하기 위한 아키텍처 패턴인 마이크로 프론트엔드에 대해 알아보았습니다.
마이크로 프론트엔드는
독립적인 개발 및 배포
,
팀 자율성 증대
,
점진적 변화
등의 장점을 제공합니다.
여러 마이크로 앱을 통합하는 방법에는
런타임 통합
(iframe, Web Components, JavaScript 통합)이 주로 사용됩니다.
Single-SPA
는 라우팅 및 라이프사이클 관리를 돕고,
Webpack Module Federation
은 코드 및 의존성 공유 문제를 효과적으로 해결합니다.
하지만 마이크로 프론트엔드는
초기 설정 복잡성
,
UI/UX 일관성 유지
,
앱 간 통신
,
운영 복잡성
등 새로운 과제들을 제시하기도 합니다.
마이크로 프론트엔드는 모든 프로젝트에 맞는 Silver bullet은 아닙니다.
애플리케이션의 규모, 팀 구조, 기술적 요구사항 등을 충분히 고려하여 도입 여부를 신중하게 결정해야 합니다.
만약 도입하기로 결정했다면, 오늘 살펴본 기술들과 고려사항들을 바탕으로 체계적인 계획과 점진적인 접근 방식을 취하는 것이 중요합니다.
다음 시간에는 프론트엔드 개발에서 API 통신을 어떻게 효과적으로 처리하는지, 비동기 작업 관리 전략에 대해 알아보겠습니다. Axios, Fetch 비교부터 AbortController, GraphQL 클라이언트까지 다양한 API 통신 방법을 살펴보겠습니다.