회사 프로젝트 멀티 모듈 도입기(1)

이영훈·2025년 4월 16일
0
post-thumbnail

안드로이드 멀티모듈 구조, 왜 쓰고 어떻게 쓰나?

안드로이드 프로젝트를 하다 보면 프로젝트 구조가 점점 커지고 복잡해지면서 모듈화를 고려하게 됩니다. 이 글에서는 "멀티모듈 구조"가 왜 필요한지, 어떤 장점이 있는지, 그리고 실제로 어떻게 적용하고 있는지에 대해 이야기해볼게요.


🛠️ 멀티모듈이란?

여러 기능을 독립적인 모듈로 나누고, 이 모듈들을 조합해 하나의 앱을 완성하는 구조입니다.


🧩 멀티모듈을 적용하게된 계기

사실 안드로이드 프로젝트가 거대해졌기 때문에 멀티모듈을 도입한 것은 아닙니다. 작업자도 저 혼자였고요.

하지만 서비스가 계속 운영되면서 백엔드 인프라는 점점 커졌고, 서비스와 CMS 양쪽 모두에서 공통 모듈들을 만들어 활용하게 되었습니다.

또한, 추후 다른 서비스를 런칭할 때에도 지금의 인프라를 최대한 재사용하고자 했고, 그에 따라 앱에서도 동일한 방식의 API 설계와 유사한 UI/UX 흐름을 자연스럽게 사용하게 됐습니다.

이런 흐름 속에서 저는 프로젝트 전체를 멀티모듈 구조로 정리해두면, 앞으로 새로운 앱을 만들 때 더 빠르고 효율적인 개발이 가능할 것이라 판단해 멀티모듈을 도입하게 되었습니다.


✨ 멀티모듈 구조의 장점

  1. 재사용성 증가
    • 공통 기능을 모듈로 만들어두면 다른 앱에서도 그대로 가져다 쓸 수 있어요.
  2. 배포 독립성
    • 변경된 모듈만 빌드/배포하면 되니 효율적이죠.
  3. 개발 독립성
    • 각 파트별로 모듈 단위로 작업할 수 있어 충돌 없이 개발 가능!
  4. 테스트 용이성
    • 독립된 모듈이라 단위 테스트나 모듈 단위 테스트가 쉬워집니다.

🌐 모듈화 방법론

1. 기능(feature) 중심 모듈화

  • 각 기능을 하나의 모듈로 구분합니다 (ex. 로그인, 메인, 설정 등)
  • 앱 규모가 작거나 기능별로 명확히 나눌 수 있을 때 적합

2. 클린 아키텍처 기반 계층(layer) 모듈화

  • presentation, domain, data 계층별로 나눕니다
  • 구조적이고 확장성이 좋습니다. 특히 팀 개발 시 추천!

✨ 저희 회사 안드로이드 프로젝트는 클린 아키텍처 기반의 방법론 2번을 채택하고 있어요.


👨‍💻 Android 모듈 종류 정리

  1. Application 모듈: 빌드의 기준이 되는 최상위 앱 모듈 -> 앱 본체
  2. Android Library 모듈: XML, Android 종속 코드 포함 (AAR 생성) -> presentation 모듈
  3. Java/Kotlin Library 모듈: 순수 Kotlin/Java 코드 포함 (JAR 생성) -> domain 모듈

🔄 Version Catalog (버전 통합 관리)

Gradle 7.0부터 제공된 라이브러리 버전 통합 관리 기능입니다.

  • 각 모듈의 의존성을 한 곳에서 관리 가능
  • IDE 자동완성 지원, 가독성 좋고 유지보수 편리함
[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에 의존할 때:

  1. Gradle이 core, domain 변경 여부 확인
  2. 변경 있으면 먼저 빌드 → 그 다음 app 빌드
  3. 변경 없으면 캐시된 결과 사용해서 빠르게 app 빌드

👀 즉, 의존성 관리만 잘 되어 있다면 효율적인 빌드가 가능하다는 것!


📚 실제 회사 프로젝트 구조

  • 클린 아키텍처 기반으로 presentation, domain, data, core 모듈로 구성
  • 앱 단위로는 AApp, BApp 등 나뉘어 각각의 루트 모듈이 존재
// 앱 별 core 모듈 분기 예시
implementation(project(":core:AApp"))
implementation(project(":core:BApp"))
  • 공통 기능 (웹뷰, 네트워크, 유틸 등)은 core로 분리해서 재사용성 확보
  • 동적인 데이터나 서비스별 세팅은 앱 모듈에서 주입

🧰 공통 모듈로 뺄만한 기능들

  1. 웹뷰 처리: 설정, 리다이렉션, 이벤트 처리
  2. 네트워크: Http client, interceptor, base response
  3. Base 구성: BaseActivity, BaseViewModel 등
  4. Push 모듈: FCM 등
  5. Local 저장소: Preferences, Room 등
  6. 유틸/리소스: 자주 쓰는 utils, 공통 assets

🌐 최종 목표는?

새로운 앱을 런칭할 때마다 "앱 모듈만 추가"하고, 기존 모듈을 조립해서 빠르게 런칭하는 구조!

멀티모듈을 통해 확장성, 유지보수성, 팀 협업 모두 좋아지는 구조를 만들 수 있어요. 물론 방법론은 방법론일 뿐이고, 우리 팀의 상황과 서비스에 맞게 유연하게 적용하는 게 가장 중요하겠죠.

실제로 어떻게 적용했는지는 이후에 풀어보도록 하겠습니다!


👉 참고 링크

profile
안드로이드 개발자입니당

0개의 댓글