![모노레포가 미리캔버스 프론트엔드 아키텍처를 뒷받침 하는 방법 [1/2]](/_next/image?url=https%3A%2F%2Fmiro.medium.com%2Fv2%2Fresize%3Afit%3A1200%2F1*dMz9wAzhg5NI-RHmtJS16Q.png&w=3840&q=75)
미리캔버스가 변화율 기반 레이어드 아키텍처로 거대 코드베이스의 복잡성을 정복한 전략을 공개합니다.
모노레포 도입 후 흔히 겪는 '공통 패키지의 늪'과 결합도 문제를 해결하기 위한 구조적 접근법을 다룹니다. 클린 아키텍처의 안정된 의존성 원칙(SDP)을 프론트엔드에 이식하여, 단순한 코드 공유를 넘어 지속 가능한 확장성을 확보하는 실전 가이드를 제시합니다.
모노레포를 사용 중이지만 서비스 간 간섭이 심해 고민인 시니어 엔지니어나, 대규모 프론트엔드 아키텍처 설계를 고민하는 팀 리더에게 강력히 추천합니다.
모노레포 환경에서 '공통(common)' 패키지가 비대해지며 도메인 로직과 결합되는 '모노레포 모놀리스' 현상이 발생했습니다. 이로 인해 유틸리티 함수 수정 시에도 수십 분의 CI 시간이 소요되고, 한 팀의 변경이 다른 팀의 개발을 방해하는 병목 현상이 심화되었습니다.
변화율(Rate of Change)을 기준으로 shared, entity, feature, service, fragment, application의 6개 계층으로 나누는 레이어드 아키텍처를 도입했습니다. 계층 간 단방향 의존성 및 동일 계층 참조 금지 규칙을 설정하고, Public API 패턴과 린터를 통해 이를 강제했습니다.
논리적 독립성을 확보하여 도메인 지식의 무분별한 전파를 막고 변경 범위를 예측 가능한 수준으로 격리하는 데 성공했습니다. 아키텍처 규칙을 도구가 직접 강제하게 함으로써 개발자의 실수를 방지하고 팀별 개발 자율성을 회복했습니다.
Trade-off
엄격한 계층 분리와 Public API 패턴 적용으로 인해 단순 기능을 구현할 때도 더 많은 파일 생성과 구조적 검토가 필요해져 초기 개발 복잡도가 증가했습니다. 또한 아키텍처 규칙을 검증하기 위한 CI 단계의 자동화 도구 구축 및 유지보수 비용이 발생합니다.
코드는 물리적으로 하나의 저장소에 모여 있으나, 내부 모듈들이 강하게 결합되어 논리적으로는 거대한 덩어리처럼 동작하는 상태입니다.
컴포넌트는 항상 자신보다 더 안정적인, 즉 변화율이 낮은 컴포넌트에 의존해야 한다는 아키텍처 설계 원칙입니다.
각 패키지의 내부 구현 세부사항은 은닉하고, index.ts와 같은 지정된 진입점을 통해서만 기능을 노출하는 방식입니다.




