앱의 규모가 커지거나 개발 기간이 길어질 수록, 앱의 확장성, 가독성, 코드 품질은 떨어질 수 있다. 모놀리틱 모듈에서 다중 모듈로의 분리를 통해 프로젝트를 더 아키텍처 기반으로 설계하고, 유지 보수성을 개선할 수 있다. 이번 포스팅에서는 모듈의 소개와 필요성 그리고 모듈을 어떤 기준으로 분리하면 좋을지에 대해서 소개한다.
모듈(Module)
모듈은 잘 정의된 범위, 논리적으로 타당한 의존성들, 모듈을 관리하는 담당자를 가지고 있는 코드 뭉치를 의미하며, 앱의 어느 부분에서 재사용될 수 있어야 한다.
모듈의 특징은 아래와 같다.
- 모듈은 소스파일 및 빌드 설정으로 구성된 모음으로 프로젝트를 구성하는 단위이다.
- 하나의 모듈이 다른 모듈을 종속 항목으로 사용할 수 있다.
- 각 모듈은 독립적으로 빌드, 테스트, 디버그를 할 수 있다.
모듈을 나누었을 때의 이점
- 프로젝트 코드베이스의 복잡도를 낮게 유지한다.
- 각각의 부서에 따라서 경계를 명확하게 하며, 다른 모듈의 영향을 최소화 한다.
- 모듈화를 통해, 내부 코드들 사이의 의존도를 낮출 수 있음.
- 코드의 복잡성을 낮추고, 테스트 가능성을 높힌다.
- 개발자의 자율성을 증대시킨다.
- 개발자들은 자기 모듈의 소유권을 가지고 작업할 수 있고, 외부 모듈의 영향력으로부터 잘 격리된 코드를 독립적인 공간에서 일 할 수 있음.
- 빌드 속도를 증진
- 병렬 처리로 인한 빌드 속도 증가
- 무거운 플러그인의 영향을 일부 모듈로 국한 시킬 수 있음.
- 개발자가 작업하는 모듈외의 다른 모듈은 dummy로 처리할 수 있음.
- Play Feature Delivery
- 중요성이 있지만 널리 사용되지 않는 기능을 필요할 때만 다운로드가 가능함. (ex : 실험실과 같은 기능, 넷플릭스 전화 기능)
- 앱의 크기와 시작을 함께 줄일 수 있음.
모듈을 구성하는 기준
모든 프로젝트에 맞는 하나의 모듈화 전략은 없다. 비즈니스 규칙 및 외부 환경에 맞게 전략을 설정해 다중 모듈 프로젝트를 구성해야 한다.
일반적으로 모듈화를 진행할 때, 나올 수 있는 질문은 아래와 같다.
- 이 모듈의 역할은 무엇인가
- 어떤 서비스, 기능을 제공하는가?
- 다른 모듈이 어떻게 사용해야 하는가?
- 이 모듈은 복잡성을 캡슐화 하는가?
- 만약 모듈 A가 모듈 B의 내부적인 동작에 강하게 의존성을 가지고 있다면, A를 B의 복잡성을 캡슐화 하지 못한 것. 따라서, 모듈 B의 API가 더 정의될 필요가 있거나, 모듈 B는 A의 일부가 되어야 한다.
- 모듈화를 나누는게 앱 전체의 캡슐화와 설계를 높힌다.
- 이 코드들은 모듈 하나로 묶으면 충분한가? 아니면 더 나뉠 여지가 있는가?
또한, 프로젝트에서 모듈화를 할 때 고려해야할 기준은 아래와 같다.
- 도메인 지식 - 하나의 모듈은 그룹화가 될만큼 명확한 도메인 지식을 캡슐화 해야 한다.
- feature 단위를 분리하고, feature들 간에서 공통적으로 사용되는 모듈을 추가적으로 분리함.
- 잘 정의 된 범위 - 좋은 범위는 새로운 기능 조각이 하나의 모듈에 속할지 않을 지를 애매하지 않게 해야 한다.
- 재사용성 - 모듈이 제공하는 기능은 여러 종류의 앱에서 상용될 수 있어야 한다.
- 선택가능성 - 모듈이 제공하는 기능은 특정 앱에서 활성화 될 수도 아닐 수도 있다.
- 의존성 관리 - 새로운 모듈은 기존 모듈과 확연히 다른 의존성을 가진다.
- 책임조직 - 장기간 이 모듈을 책임질 조직이 존재해야 한다.
모듈 분류 주의사항
- 기존에 이미 분류해 놓은 패키지 구조를 그대로 옮기지 말기
- 단순히 패키지로 나눈 구조는 충분히 나누어져있지 않을 가능성이 높다.
- 모듈을 단순히 피처나 팀에 따라서 나누는 것은 이상적인 모듈 구조를 만들지 못함.
- 비즈니스적으로 의미있는 단위, 도메인 단위로 나누는것이 좋음.
- 각 모듈은 시스템을 대변해야 하며, 타 모듈과의 상호작용을 위해 나누어져야 한다.
- 하나의 모듈이 많은 역할을 한다면, 분리해야 하는 신호일 수 도 있음.
- 하나의 모듈이 오직 하나의 의존성을 위해 사용된다면 모듈을 분리시킬 필요가 없음. (재사용성 중요)
- 모듈 사이즈는 모듈 분류의 기준이 될 수 없음.
모듈을 나누는 과정
- 모듈로 나눌 수 있는 후보 코드 선정
- 해당 코드들의 의존성 이슈를 해결
- 불필요한 의존성은 삭제 및 다른 곳으로 이동
- 목표 모듈이 interface/impl module로 나누어져야 하는지 결정
- 모듈간의 순환참조가 발생한다고 판단되는 경우
- 모듈을 위한 DI 설정 작성
- 어느정도 커버리지를 만족할 때까지 단위테스트
- README.md 파일 수정 및 담당자 명시
- 모듈을 작성하고 코드 이동
마지막으로
이번 포스팅을 통해 모듈과 모듈화에 대한 전반적인 이해를 얻게 되었다. 다중 모듈 프로젝트를 진행하면서 모듈을 나눠야 하는 기준에 대해서는 항상 깊게 생각하게 되는 것 같다. 모듈화를 통해 기존에 합쳐진 모듈에서 발생하지 않았던 문제가 발생할 수 있다. 그러나 이런 문제가 발생함에도 모듈은 많이 나누면 나눌 수록, 해당 모듈이 가지는 의존성과 재사용성 측면에서 도움이 되는 것 같다. 다음 포스팅에서는 모듈화를 하며 발생할 수 있는 문제점과 이에 대한 해결 방법에 대해서 소개하려고 한다.
참고 문헌
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장 멀티 모듈 프로젝트