[Flutter] Monorepo 적용해보기(feat. Melos)
프로젝트의 규모가 커질수록 관리는 더욱 힘들어지는 경험을 해보신분이 있으실까요 ?
처음에는 기능이 얼마없었는데, 계속 기능이 추가되면 프로젝트가 점점 더 커질것인데 이를 해결할 수 있는 방법중하나는 Monorepo입니다. (반대는 Multirepo가 있지만 이번글에서는 소개하지 않겠습니다.)
Monorepo란?
- 코드 공유와 재사용 용이
공통된 코드베이스를 여러 프로젝트에서 쉽게 공유하고 재사용이 가능
- 통합된 빌드 및 테스트 환경
모든 프로젝트에 대한 빌드 및 테스트를 하나의 환경에서 실행 가능
- 일관된 버전 관리와 의존성 관리
프로젝트 간 의존성 충돌을 줄이고, 한 번의 업데이트로 여러 프로젝트에 영향을 줌
하지만 장점만 존재할 수는 없겠죠? 하나의 앱을 여러개의 모듈로 쪼개고, 각각의 모듈을 빌드해야되기떄문에 빌드시간 및 관리 복잡성이 증가합니다. 추가적으로 리소스가 증가하기때문에 통합 테스트를 진행할때 꽤 많은 양의 자원이 필요합니다.
이렇게 만들어진 구조를 새로운 개발자가 들어와서 적응한다면, 학습 곡선도 존재하게 되는 등 도입하기 전에는 여러가지 고려사항들이 있습니다. (각자 판단 해서 사용하시길...)
Flutter에서 Monorepo를 구성할 수 있도록 도와주는 Pub으로는 Melos가 대표적으로 있는데요 이것에 대해 소개해보겠습니다.

Melos
여러 개의 패키지를 단일 저장소에서 효과적으로 관리할 수 있도록 설계된 Monorepo 도구
git 과 pub 을 사용하여 여러 패키지 저장소를 관리하는 작업 흐름을 최적화하는 도구
기능
패키지 연결
의존성 오버라이드 없이 로컬 패키지를 서로 연결하려면 다음과 같이 melos bootstrap 명령어를 사용
=> 로컬 패키지들 사이의 의존성을 자동으로 연결하고, 필요한 패키지들을 적절히 연결
자동 버전 관리 및 출시
Conventional Commits 규칙을 사용하여 자동으로 패키지의 버전을 관리하고, 변경 로그를 생성하며, 패키지를 출시할 수 있는데
다음과 같이 melos version 명령어를 사용
=> 모든 변경 사항을 검토하고, Conventional Commits 규칙에 따라 적절한 버전 업그레이드를 자동으로 수행
사전 정의된 스크립트
melos.yaml 에서 스크립트를 작성하면 Configuration에 추가되어 편리하게 사용가능


패키지 필터링
다양한 필터를 제공하여 특정 조건에 맞는 패키지를 대상으로 작업을 수행할 수 있게 한다.
예를 들어, Flutter SDK 에 의존하는 패키지만을 대상으로 명령을 실행하려면
다음과 같이 melos exec —flutter — flutter test 명령어 사용
이제 실전으로 넘어가서 적용해보겠습니다.
새로운 프로젝트를 생성했는데, 간단하게 앱, Core 패키지 2가지로 나눠서 보도록하겠습니다.(여기서 Core는 공통 모듈로서 역할을 합니다)
1. pubspec.yaml에 melos 종속성 추가

2. 패키지 생성 ( Core Package )
flutter create --template=package core
flutter pub get
Core Package를 생성하고 App Package는 기존에 파일들을 안으로 넣는 작업만 하면됩니다.


3. melos.yaml 작성
name: melos_ex
packages:
- app
- core
packages에는 패키지들을 명시해주면됩니다.(Root Dir를 기준으로한 path 입력)
4. melos bootstrap 실행
melos bootstrap



이제 설정이 끝났는데요, 콘솔에는 성공했다고 표시되고 Configuration에 추가가 된 것을 확인할 수 있습니다.
추가적인 script는 개인이 사용하고싶은대로 사용하고 다른 패키지를 추가하려면 path에 경로만 잘 명시해주면 됩니다.
기존 프로젝트에서 Monorepo로 이전하는것에는 많은 비용이 필요하지만, 그만큼 이점을 얻을수 있는 부분도 있습니다.
하지만 도입하기전에 고려해야될 사항 및 의존성에 대한 문제는 꼭 해결하고 넘어가야한다고 생각합니다.
기존에 작동하던 앱이 Monorepo로 이전한다고 해서 작동하지 않는다..? 노력이 물거품이 되는 순간...이네요... 그렇게 되지않기위해선 꼭 검토하시고 도입하는것을 추천드립니다!(느슨한 결합, 높은 응집력은 항상 어렵다.....)
이상 monorepo에 대한 소개는 여기까지하고, 오늘도 빡코딩하시길 바랍니다.