Android

Android Multi Module : 모듈의 필요성과 분리 기준

정자이노 2023. 7. 16. 16:42

앱의 규모가 커지거나 개발 기간이 길어질 수록, 앱의 확장성, 가독성, 코드 품질은 떨어질 수 있다. 모놀리틱 모듈에서 다중 모듈로의 분리를 통해 프로젝트를 더 아키텍처 기반으로 설계하고, 유지 보수성을 개선할 수 있다. 이번 포스팅에서는 모듈의 소개와 필요성 그리고 모듈을 어떤 기준으로 분리하면 좋을지에 대해서 소개한다. 

 

모듈(Module)

모듈은 잘 정의된 범위, 논리적으로 타당한 의존성들, 모듈을 관리하는 담당자를 가지고 있는 코드 뭉치를 의미하며, 앱의 어느 부분에서 재사용될 수 있어야 한다. 

모듈의 특징은 아래와 같다.

  • 모듈은 소스파일 및 빌드 설정으로 구성된 모음으로 프로젝트를 구성하는 단위이다. 
  • 하나의 모듈이 다른 모듈을 종속 항목으로 사용할 수 있다. 
  • 각 모듈은 독립적으로 빌드, 테스트, 디버그를 할 수 있다.

 

모듈을 나누었을 때의 이점

  1. 프로젝트 코드베이스의 복잡도를 낮게 유지한다.
    • 각각의 부서에 따라서 경계를 명확하게 하며, 다른 모듈의 영향을 최소화 한다.
  2. 모듈화를 통해, 내부 코드들 사이의 의존도를 낮출 수 있음. 
    • 코드의 복잡성을 낮추고, 테스트 가능성을 높힌다.
  3. 개발자의 자율성을 증대시킨다.
    • 개발자들은 자기 모듈의 소유권을 가지고 작업할 수 있고, 외부 모듈의 영향력으로부터 잘 격리된 코드를 독립적인 공간에서 일 할 수 있음.
  4. 빌드 속도를 증진
    • 병렬 처리로 인한 빌드 속도 증가
    • 무거운 플러그인의 영향을 일부 모듈로 국한 시킬 수 있음. 
    • 개발자가 작업하는 모듈외의 다른 모듈은 dummy로 처리할 수 있음. 
  5. Play Feature Delivery
    • 중요성이 있지만 널리 사용되지 않는 기능을 필요할 때만 다운로드가 가능함. (ex : 실험실과 같은 기능, 넷플릭스 전화 기능)
    • 앱의 크기와 시작을 함께 줄일 수 있음. 

 

모듈을 구성하는 기준 

모든 프로젝트에 맞는 하나의 모듈화 전략은 없다. 비즈니스 규칙 및 외부 환경에 맞게 전략을 설정해 다중 모듈 프로젝트를 구성해야 한다. 

일반적으로 모듈화를 진행할 때, 나올 수 있는 질문은 아래와 같다. 

  • 이 모듈의 역할은 무엇인가
    • 어떤 서비스, 기능을 제공하는가?
    • 다른 모듈이 어떻게 사용해야 하는가?
  • 이 모듈은 복잡성을 캡슐화 하는가?
    • 만약 모듈 A가 모듈 B의 내부적인 동작에 강하게 의존성을 가지고 있다면, A를 B의 복잡성을 캡슐화 하지 못한 것. 따라서, 모듈 B의 API가 더 정의될 필요가 있거나, 모듈 B는 A의 일부가 되어야 한다. 
    • 모듈화를 나누는게 앱 전체의 캡슐화와 설계를 높힌다.
  • 이 코드들은 모듈 하나로 묶으면 충분한가? 아니면 더 나뉠 여지가 있는가?

 

또한, 프로젝트에서 모듈화를 할 때 고려해야할 기준은 아래와 같다. 

  • 도메인 지식 - 하나의 모듈은 그룹화가 될만큼 명확한 도메인 지식을 캡슐화 해야 한다.
    • feature 단위를 분리하고, feature들 간에서 공통적으로 사용되는 모듈을 추가적으로 분리함. 

  • 잘 정의 된 범위 - 좋은 범위는 새로운 기능 조각이 하나의 모듈에 속할지 않을 지를 애매하지 않게 해야 한다.
  • 재사용성 - 모듈이 제공하는 기능은 여러 종류의 앱에서 상용될 수 있어야 한다.
  • 선택가능성 - 모듈이 제공하는 기능은 특정 앱에서 활성화 될 수도 아닐 수도 있다.
  • 의존성 관리 - 새로운 모듈은 기존 모듈과 확연히 다른 의존성을 가진다.
  • 책임조직 - 장기간 이 모듈을 책임질 조직이 존재해야 한다.

 

모듈 분류 주의사항

  1. 기존에 이미 분류해 놓은 패키지 구조를 그대로 옮기지 말기
    • 단순히 패키지로 나눈 구조는 충분히 나누어져있지 않을 가능성이 높다. 
  2. 모듈을 단순히 피처나 팀에 따라서 나누는 것은 이상적인 모듈 구조를 만들지 못함.
    • 비즈니스적으로 의미있는 단위, 도메인 단위로 나누는것이 좋음.
    • 각 모듈은 시스템을 대변해야 하며, 타 모듈과의 상호작용을 위해 나누어져야 한다.
  3. 하나의 모듈이 많은 역할을 한다면, 분리해야 하는 신호일 수 도 있음.
  4. 하나의 모듈이 오직 하나의 의존성을 위해 사용된다면 모듈을 분리시킬 필요가 없음. (재사용성 중요)
  5. 모듈 사이즈는 모듈 분류의 기준이 될 수 없음.

 

모듈을 나누는 과정

  1. 모듈로 나눌 수 있는 후보 코드 선정
  2. 해당 코드들의 의존성 이슈를 해결
    • 불필요한 의존성은 삭제 및 다른 곳으로 이동
  3. 목표 모듈이 interface/impl module로 나누어져야 하는지 결정
    • 모듈간의 순환참조가 발생한다고 판단되는 경우 
  4. 모듈을 위한 DI 설정 작성
  5. 어느정도 커버리지를 만족할 때까지 단위테스트
  6. README.md 파일 수정 및 담당자 명시
  7. 모듈을 작성하고 코드 이동

 

마지막으로

이번 포스팅을 통해 모듈과 모듈화에 대한 전반적인 이해를 얻게 되었다. 다중 모듈 프로젝트를 진행하면서 모듈을 나눠야 하는 기준에 대해서는 항상 깊게 생각하게 되는 것 같다. 모듈화를 통해 기존에 합쳐진 모듈에서 발생하지 않았던 문제가 발생할 수 있다. 그러나 이런 문제가 발생함에도 모듈은 많이 나누면 나눌 수록, 해당 모듈이 가지는 의존성과 재사용성 측면에서 도움이 되는 것 같다. 다음 포스팅에서는 모듈화를 하며 발생할 수 있는 문제점과 이에 대한 해결 방법에 대해서 소개하려고 한다. 

 

 

참고 문헌

https://developer.android.com/topic/modularization?hl=ko 

 

Android 앱 모듈화 가이드  |  Android 개발자  |  Android Developers

Android 앱 모듈화 가이드 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 여러 Gradle 모듈이 있는 프로젝트를 다중 모듈 프로젝트라고 합니다. 이 가이드에는

developer.android.com

https://www.charlezz.com/?p=46545 

 

안드로이드 앱 모듈화 가이드 | 찰스의 안드로이드

모듈이란? 모듈(module)이란 앱을 구성하는 요소로, 관련된 소스 코드나 리소스 등을 하나로 묶는 단위다. 최근에는 앱 모듈에 모든 코드를 작성하지 않고, data나 domain 등의 모듈로 세분화 시켜

www.charlezz.com

The Red 강사룡의 모바일 앱 아키텍처 가이드 : 6장 멀티 모듈 프로젝트