멀티 모듈 프로젝트를 구성할 때 가장 중요한 것은 모듈화 전략을 세우는 것입니다. 하지만 하나의 특정한 모듈화 전략이 존재하는 것은 아닙니다. 각 프로젝트의 특성과 요구사항에 맞게 전략을 구성해야 합니다. 이를 위해서는 일반적으로 세 가지 항목을 고려해야 합니다.
응집도란 모듈 내부의 구성요소들이 하나의 목적을 위해 얼마나 밀접하게 관련되어 있는지를 나타내는 개념입니다. 모듈은 맡은 일이 명확히 규정되어 있고 특정 도메인 지식의 범위를 벗어나지 않아야 합니다. 높은 응집도를 갖는 모듈은 기능을 구현하고 유지보수하기 쉽습니다. 그러나 낮은 응집도를 갖는 모듈은 기능을 파악하기 어렵고 유지보수하기 어렵습니다. 따라서 모듈 내부의 구성요소들을 효과적으로 조직화하여 응집도를 높이는 것이 좋은 소프트웨어 개발 방법론의 핵심 원칙 중 하나입니다.
결합도는 다른 모듈들과의 상호작용의 정도를 나타내는 개념입니다. 모듈이 최대한 서로 독립적이어야 한다는 것을 의미합니다. 변경사항이 다른 모듈에 미치는 영향을 최소화해야 합니다. 모듈 간의 관계를 최대한 느슨하게 유지하기 위해서는 인터페이스 사용 등을 통해 코드를 추상화해야 합니다.
세분성은 모듈의 크기와 복잡도에 대한 개념입니다. 적절한 세분화 수준이 유지되지 않으면 코드의 가독성이 떨어지고 유지보수가 어려워집니다. Granularity는 모듈 수를 코드 베이스로 나눈 것으로, 높은 세분성을 갖는 것이 항상 좋은 것은 아닙니다. 프로젝트의 특성과 요구사항에 맞게 적절한 세분화 수준을 찾아야 합니다.
이러한 기준을 고려하여 끊임없이 모듈로 분리하고 통합하는 과정을 거치면, 진행 중인 프로젝트에 알맞은 모듈화 전략을 찾을 수 있습니다.
모듈의 세분화와 관련하여 아래 유형들을 적절히 조합하여 안드로이드 앱을 모듈화하는 것이 유지보수성과 확장성을 향상시킬 수 있습니다.





일반 모듈 또는 핵심 모듈로 불리며 다른 모듈에서 자주 사용하는 코드를 포함하고 중복성을 줄이는 역할을 합니다.특정 레이어를 나타내지 않고, 앱 아키텍처의 전반적인 구성에 기여합니다. 일반 모듈은 여러 모듈로 나눌수 있습니다.
모듈은 완전히 분리된 경우는 거의 없으며 다른 모듈에 의존해 서로 통신하는 경우가 많습니다. 모듈이 함께 작동하고 정보를 자주 교환하는 경우에도 결합력을 낮게 유지하는 것이 중요합니다. 경우에 따라 두 가지 모듈 간의 직접 통신은 아키텍처 제약 조건의 경우에서처럼 바람직하지 않습니다.

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