본문 바로가기

안드로이드/멀티 모듈

[안드로이드 멀티 모듈] 1. 멀티 모듈 개념과 장단점


안드로이드 멀티 모듈 시리즈에서는 멀티 모듈에 대한 이해와 실제 프로젝트에서 어떻게 세팅하는지에 대해 다룰 예정입니다. 코드 작업을 수행한 경우, 각 포스팅 하단에 Github 링크를 공유할 예정이며, 브랜치를 확인하시면 됩니다.

 

GitHub - taein8935/multi-module-template-aos

Contribute to taein8935/multi-module-template-aos development by creating an account on GitHub.

github.com


먼저 멀티 모듈을 이해하기 전에 모듈이 무엇인지 살펴보겠습니다.

1. 모듈이란?

모듈은 간단히 말해서 라이브러리라고 생각하면 됩니다.
프로젝트에 추가한 모든 라이브러리(의존성) 또한 모듈입니다.
즉, 특정한 목적을 수행하는 코드가 격리된 컨테이너라고 생각할 수 있습니다.

프로젝트 생성 후에 app 수준의 build.gradle 파일의 하단에 있는 dependencies 블록을 확인해 보겠습니다.
dependencies 블록에 선언돼 있는 모든 싱글 라인들이 각 모듈을 우리의 프로젝트에 포함시켰다고 볼 수 있습니다.

필요한 모듈을 사용하기 위해 dependencies에 추가
필요한 모듈을 사용하기 위해 dependencies에 추가


이렇게 필요한 모듈을 추가함으로써 각 모듈에서 제공하는 기능을 사용할 수 있게 됩니다.
그렇다면 포스팅의 주제인 멀티 모듈이란 무엇인지 알아보겠습니다.

2. 멀티 모듈이란?

위에서 모듈은 라이브러리라고 배웠습니다.

기본적으로 안드로이드 스튜디오에서 새 프로젝트를 만든 경우 프로젝트에는 이미 'app'이라는 하나의 모듈이 있습니다.
'app' 모듈이 자동으로 생성되는 이유는 모든 앱에는 어플리케이션의 진입점 역할을 하는 하나의 앱 모듈이 있어야 하기 때문입니다.

같은 방식으로 프로젝트에서 로컬로 사용하는 자체 모듈, 즉 라이브러리를 만들 수도 있습니다.
이러한 경우에는 Maven과 같은 저장소에 배포하지 않고, 프로젝트에서 격리된 컨테이너를 사용하는 방식입니다.
Android Library를 선택해서 모듈을 한 개 만들어보겠습니다.

File -> New -> New Module을 선택한 모습
mylibrary 모듈이 생성된 모습


mylibrary 모듈이 생성되고 실제로 모듈로 인식된 모습을 볼 수 있습니다.
Gradle은 어떻게 mylibrary가 모듈이라는 것을 인식할 수 있었을까요?

그 이유는 settings.gradle.kts 파일의 하단에 include 함수를 사용해서 모듈의 이름 앞에 콜론을 붙여서 참조하기 때문입니다. 저희가 추가하는 모든 모듈은 setting.gradle.kts 파일에 나열됩니다.

이러한 방식으로 data, domain, presentation 등의 모듈을 추가해서 작업하는 아키텍처를 안드로이드에서는 멀티모듈 프로젝트라고 표현합니다.

3. 멀티 모듈의 장단점

제가 생각하는 멀티 모듈 아키텍처의 장단점은 아래와 같습니다.

3-1. 장점

  • 관심사를 분리할 수 있습니다. 즉, 개발자가 실수로 팀이 설계한 아키텍처에 위배되는 행위를 할 수 없습니다.
    예를 들어, Domain 모듈에서 실수로 Presentation 및 Data 모듈에 있는 클래스 등을 참조할 수 없습니다.
  • 빌드속도가 빨라집니다. 변경된 모듈만 빌드하며, 여러 모듈을 병렬로 빌드할 수도 있기 때문입니다.
    예를 들어, Presentation 모듈이 아무 모듈도 의존하지 않는다면 Presentation 모듈을 수정했을때 해당 모듈에 대해서만 빌드를 수행합니다. 하지만, Domain 모듈이 변경되면 Domain 모듈에 의존하고있는 Presentation 및 Data 모듈도 빌드가 수행됩니다.
  • 낮은 결합도와 높은 응집력으로 구성하는데 도움을 줍니다. 이는 안드로이드뿐만 아니라 모든 소프트웨어 설계의 기본 원칙에 해당됩니다.
  • 협업할 때 서로 분리된 환경에서 작업하기 때문에 충돌이 발생할 확률이 줄어듭니다.
  • Dynamic Feature를 사용할 수 있습니다. Dynamic Feature는 런타임중에 특정 모듈을 다운로드할 수 있는 기능입니다. 예를 들어, 리소스를 많이 차지하는 특정 모듈이 있는데, 이 기능이 필요하지 않은 사용자는 APK 사이즈만 커질 뿐입니다. 그런데 Dynamic Feature를 구성하면 사용자가 원할때만 앱 실행 중에 모듈(Dynamic Feature)을 다운로드할 수 있습니다.

3-2. 단점

  • 초기에 멀티모듈 환경을 구축하는데 시간이 많이 소요됩니다. 그리고 Gradle 관련 버그가 발생해서 실제 개발보다 환경 구축하는데 시간이 더 소요될 수 있습니다.
  • 모듈을 무분별하게 생성하면 오히려 복잡해질 수 있습니다.

4. 정리

이번 포스팅에서는 모듈 및 멀티 모듈의 개념에 대해서 설명했습니다.

최근에는 기능의 분리, 협업 시 코드 충돌을 해결하기 위해서 멀티 모듈 프로젝트로 구성을 하곤 합니다.

하지만 개인적으로 멀티 모듈은 초기 세팅 및 Gradle 버그를 수정하는데 시간이 많이 소요된다고 생각이 들어서 단일 모듈로 프로젝트를 진행하는 편입니다. 대신, 단일 패키지를 구조를 모듈처럼 만들어서 멀티 모듈 아키텍처로 쉽게 전환할 수 있는 방식으로 개발하고 있습니다.

다음 포스팅에서는 앱을 개발하기 위한 domain, data 등의 모듈을 생성해보겠습니다.

반응형