Android 모듈화 패턴

김성환·2024년 4월 15일

효율적인 멀티 모듈화 전략을 위한 3가지 기준

멀티 모듈 프로젝트를 구성할 때 가장 중요한 것은 모듈화 전략을 세우는 것입니다. 하지만 하나의 특정한 모듈화 전략이 존재하는 것은 아닙니다. 각 프로젝트의 특성과 요구사항에 맞게 전략을 구성해야 합니다. 이를 위해서는 일반적으로 세 가지 항목을 고려해야 합니다.

응집도 (Cohesion)

응집도란 모듈 내부의 구성요소들이 하나의 목적을 위해 얼마나 밀접하게 관련되어 있는지를 나타내는 개념입니다. 모듈은 맡은 일이 명확히 규정되어 있고 특정 도메인 지식의 범위를 벗어나지 않아야 합니다. 높은 응집도를 갖는 모듈은 기능을 구현하고 유지보수하기 쉽습니다. 그러나 낮은 응집도를 갖는 모듈은 기능을 파악하기 어렵고 유지보수하기 어렵습니다. 따라서 모듈 내부의 구성요소들을 효과적으로 조직화하여 응집도를 높이는 것이 좋은 소프트웨어 개발 방법론의 핵심 원칙 중 하나입니다.

결합도 (Coupling)

결합도는 다른 모듈들과의 상호작용의 정도를 나타내는 개념입니다. 모듈이 최대한 서로 독립적이어야 한다는 것을 의미합니다. 변경사항이 다른 모듈에 미치는 영향을 최소화해야 합니다. 모듈 간의 관계를 최대한 느슨하게 유지하기 위해서는 인터페이스 사용 등을 통해 코드를 추상화해야 합니다.

세분성 (Granularity)

세분성은 모듈의 크기와 복잡도에 대한 개념입니다. 적절한 세분화 수준이 유지되지 않으면 코드의 가독성이 떨어지고 유지보수가 어려워집니다. Granularity는 모듈 수를 코드 베이스로 나눈 것으로, 높은 세분성을 갖는 것이 항상 좋은 것은 아닙니다. 프로젝트의 특성과 요구사항에 맞게 적절한 세분화 수준을 찾아야 합니다.

이러한 기준을 고려하여 끊임없이 모듈로 분리하고 통합하는 과정을 거치면, 진행 중인 프로젝트에 알맞은 모듈화 전략을 찾을 수 있습니다.


모듈 유형

모듈의 세분화와 관련하여 아래 유형들을 적절히 조합하여 안드로이드 앱을 모듈화하는 것이 유지보수성과 확장성을 향상시킬 수 있습니다.

데이터 모듈

  • 저장소, 데이터 소스, 모델 클래스 등을 포함합니다.
  • 특정 도메인의 모든 데이터와 비즈니스 로직을 캡슐화합니다.
  • 저장소를 외부 API로 노출하여 외부로부터의 구현 세부 정보를 숨깁니다.

기능 모듈

  • 화면 또는 밀접하게 관련된 일련의 화면을 의미합니다.
  • 앱에 하단 탐색 메뉴가 있는 경우, 각 대상이 기능일 가능성이 높습니다.
  • UI와 ViewModel이 연결되어 로직과 상태를 처리합니다.
  • 단일 기능이 단일 보기나 단일 탐색 대상으로 제한될 필요는 없습니다
  • 기능 모듈은 데이터 모듈에 종속됩니다.

앱 모듈


  • 애플리케이션의 진입점을 정의합니다.
  • 기능 모듈에 종속되며, 주로 루트 탐색을 제공합니다.
  • 여러 기기 유형을 타겟팅하는 경우 기기별로 앱 모듈을 정의할 수 있습니다.

일반 모듈 및 핵심 모듈

일반 모듈 또는 핵심 모듈로 불리며 다른 모듈에서 자주 사용하는 코드를 포함하고 중복성을 줄이는 역할을 합니다.특정 레이어를 나타내지 않고, 앱 아키텍처의 전반적인 구성에 기여합니다. 일반 모듈은 여러 모듈로 나눌수 있습니다.

  • UI 모듈
    앱에서 맞춤 UI 요소를 사용하거나 정교한 브랜딩을 사용하는 경우
  • 애널리틱스 모듈
    애널리틱스 추적기를 서로 관련 없는 여러 구성요소에 사용하는 경우
  • 네트워크 모듈
    많은 모듈에 네트워크 연결이 필요한 경우
  • 유틸리티 모듈
    유틸리티 기능을 제공하는 경우

모듈 간 통신

모듈은 완전히 분리된 경우는 거의 없으며 다른 모듈에 의존해 서로 통신하는 경우가 많습니다. 모듈이 함께 작동하고 정보를 자주 교환하는 경우에도 결합력을 낮게 유지하는 것이 중요합니다. 경우에 따라 두 가지 모듈 간의 직접 통신은 아키텍처 제약 조건의 경우에서처럼 바람직하지 않습니다.

이 문제를 극복하기 위해 두 개의 다른 모듈 간을 중재하는 세 번째 모듈을 둘 수 있습니다. 이때 Navigation이나 ViewModel을 사용할수 있습니다. 주의할점으로는 객체를 탐색 인수로 전달해서는 안되며 대신 간단한 ID를 사용하여 데이터 영역에서 원하는 리소스에 액세스하고 로드하는것 적절합니다.


reference
https://developer.android.com/topic/modularization/patterns?hl=ko
https://www.charlezz.com/?p=46545

0개의 댓글