안드로이드 프로젝트를 하다 보면 프로젝트 구조가 점점 커지고 복잡해지면서 모듈화를 고려하게 됩니다. 이 글에서는 "멀티모듈 구조"가 왜 필요한지, 어떤 장점이 있는지, 그리고 실제로 어떻게 적용하고 있는지에 대해 이야기해볼게요.
여러 기능을 독립적인 모듈로 나누고, 이 모듈들을 조합해 하나의 앱을 완성하는 구조입니다.
사실 안드로이드 프로젝트가 거대해졌기 때문에 멀티모듈을 도입한 것은 아닙니다. 작업자도 저 혼자였고요.
하지만 서비스가 계속 운영되면서 백엔드 인프라는 점점 커졌고, 서비스와 CMS 양쪽 모두에서 공통 모듈들을 만들어 활용하게 되었습니다.
또한, 추후 다른 서비스를 런칭할 때에도 지금의 인프라를 최대한 재사용하고자 했고, 그에 따라 앱에서도 동일한 방식의 API 설계와 유사한 UI/UX 흐름을 자연스럽게 사용하게 됐습니다.
이런 흐름 속에서 저는 프로젝트 전체를 멀티모듈 구조로 정리해두면, 앞으로 새로운 앱을 만들 때 더 빠르고 효율적인 개발이 가능할 것이라 판단해 멀티모듈을 도입하게 되었습니다.
presentation
, domain
, data
계층별로 나눕니다✨ 저희 회사 안드로이드 프로젝트는 클린 아키텍처 기반의 방법론 2번을 채택하고 있어요.
Gradle 7.0부터 제공된 라이브러리 버전 통합 관리 기능입니다.
[versions]
hilt = "2.44"
[libraries]
hilt-android = {group = "com.google.dagger", name = "hilt-android", version.ref = "hilt"}
// 모듈별 build.gradle
implementation(libs.hilt.android)
app
모듈이 core
, domain
에 의존할 때:
core
, domain
변경 여부 확인app
빌드app
빌드👀 즉, 의존성 관리만 잘 되어 있다면 효율적인 빌드가 가능하다는 것!
presentation
, domain
, data
, core
모듈로 구성AApp
, BApp
등 나뉘어 각각의 루트 모듈이 존재// 앱 별 core 모듈 분기 예시
implementation(project(":core:AApp"))
implementation(project(":core:BApp"))
core
로 분리해서 재사용성 확보새로운 앱을 런칭할 때마다 "앱 모듈만 추가"하고, 기존 모듈을 조립해서 빠르게 런칭하는 구조!
멀티모듈을 통해 확장성, 유지보수성, 팀 협업 모두 좋아지는 구조를 만들 수 있어요. 물론 방법론은 방법론일 뿐이고, 우리 팀의 상황과 서비스에 맞게 유연하게 적용하는 게 가장 중요하겠죠.
실제로 어떻게 적용했는지는 이후에 풀어보도록 하겠습니다!