코드 베이스가 계속 증가하다 보면 시간이 지남에 따라 확장성, 가독성 및 전반적인 코드 품질이 떨어지는 경우가 있다.
모듈화는 유지 관리 가능성을 개선하고 이러한 문제를 방지할 수 있는 방식으로 코드베이스를 구조화하는 방법이다.
모듈화
- 코드베이스를 느슨하게 결합된 독립적은 부분으로 구성하는 방법이다
- 각 부분이 모듈에 해당하며, 각 모듈은 독립적이며 명확한 역할을 한다.
- 하위 문제를 해결하기 위해 문제를 더 작고 쉬운 문제로 나누면 대형 시스템 설계와 유지보수의 복잡성이 줄어든다.

모듈식 코드베이스에서만 얻을수 있는 이점
코드 베이스의 유지관리 가능성과 전반적인 품질을 개선하는 데 중점을 둔다
1. 재사용성
- 코드를 공유하고 동일한 기반을 토대로 여러 앱을 빌드할 수 있다.
- 모듈은 사실상 구성요소의 역할을 하고, 앱은 기능의 총합으로, 각 기능은 별도 모듈 형태로 구성된다.
- 특정 모듈이 제공하는 기능은 특정 앱에 사용되거나 사용되지 않을 수 있다.
ex) :feature:news가 전체 버전과 Wear앱에는 있고 데모버전에는 없을 수 있다.
2. 엄격한 공개 상태 제어
- 코드베이스의 다른 부분에 노출할 내용을 쉽게 제어할 수 있다.
- 공개 인터페이스를 제외한 모든 항목을 internal 또는 private로 표시하여 모듈 외부에서 사용하지 못하도록 할 수 있다.
3. 맞춤설정 가능한 전송
- Play Feature Delivery는 App Bundle의 고급 기능을 사용하여 앱의 특정 기능을 조건부로 또는 주문형으로 전송할 수 있도록 한다.
(기본 앱의 기능을 기능 모듈로 분리하면)
Play Feature Delivery - 앱의 크기, 성능, 사용자 경험을 최적화하는 방법.
앱의 특정 기능을 조건부로 전송하거나 주문형으로 다운로드할 수 있도록 하는 Google Play Store의 기능
모듈화를 사용하면 더 극대화할 수 있는 이점
1. 확장성
- 긴밀히 결합된 코드베이스에서는 하나의 변경사항이 관련 없어 보이는 코드 부분까지도 연쇄적으로 바꾸어 놓을 수 있다.
- 적절히 모듈화된 프로젝트는 관심사의 분리 원칙을 수용하므로 결합을 제한한다.
- 이를 통해 참여자는 더 큰 자율성으로 더 많은 권한을 얻게 된다.
그래서 확장성이랑 설명이랑 무슨 연관? 🤔
긴밀히 결합된 코드베이스에서는 확장에 제한이 생길 수 있다
따라서 모듈화를 통해 새로운 기능을 추가하거나 기존 코드를 확장할 때 복잡성을 크게 주고, 서로 간섭 없이 병렬적으로 기능 개발과 확장을 가능하게 한다
2. 소유권
- 책임성을 부여하는 데도 사용할 수 있다.
- 모듈에는 코드 유지관리, 버그 수정, 테스트 추가, 변경사항 검토 등을 담당하는 전용 수유자를 둘 수 있다.
3. 캡슐화
- 캡슐화란? 코드의 각 부분이 다른 부분에 관한 지식을 최소한으로만 갖고 있어야 함을 의미한다.
- 분리된 코드가 읽고 이해하기가 더 쉽다
4. 테스트 가능성
- 코드를 얼마나 쉽게 테스트할 수 있는지를 나타낸다
- 테스트 가능한 코드는 구성요소를 격리된 상태로 테스트 할 수 있는 코드다.
5. 빌드시간
- 중분 빌드, 빌드 캐시 또는 병렬 빌드와 같은 일부 Gradle 기능은 모듈성을 활용하여 빌드 성능을 개선할 수 있다.
고려사항 - 세분화
- 코드베이스의 세분화는 코드베이스가 모듈로 구성된 정도를 말한다. 코드베이스가 세분화되면 될수록 모듈이 더 작고 숫자가 늘어난다.
- 모듈식 코드베이스를 설계할 때 세분화의 수준을 결정해야 한다. 그렇게 하려면 코드베이스의 크기와 상대적 복잡성을 고려해야 한다.
- 너무 세분화 되면 오버헤드가 가중되고 너무 대략적이면 모듈화의 이점이 줄어든다
문제점
1. 너무 세분화됨
- 빌드 복잡성과 Boilerplate code(상용구 코드)가 늘어남으로써 모든 모듈에서 일정량의 오버헤드가 발생한다.
- 복잡한 빌드 구성으로 인해 모듈 간에 일관된 구성을 유지하기가 어렵다
- 상용구 코드가 너무 많아 관리하기 어렵고 번거로운 코드베이스가 된다.
- 오버헤드가 확장성 개선에 해가 되는 경우 일부 모듈을 통합하는 것이 좋다.
Boilerplate code
특정 작업을 수행하기 위해 반복적으로 작성해야 하는 상용구 코드 또는 필수적인 코드 블록
2. 너무 대략적임
- 반대로 모듈이 너무 커지만 또 하나의 모놀리식이 될 수 있으며 모듈성이 제공하는 이점을 놓칠 수 있다
- 작은 프로젝트에서는 데이터 영역을 단일 모듈 내에 넣어도 괜찮다.
- 그러나 크기가 커지면 저장소와 데이터 소스를 독립형 모듈로 분리해야 할 수 있다.
3. 너무 복잡함
- 프로젝트를 모듈화하는 결정적 요소는 코드베이스의 크기이다.
- 프로젝트가 특정 기준점 이상으로 확장될 것같지 않으면 확장성 및 빌드 시간 면의 이점은 누릴 수 없다.
재사용성, 엄격한 공개 상태 제어 등의 이점이 필요하거나 Play Feature Delivery를 사용하려면 모듈화가 필수다. 그러지는 않더라도 확장성과 소유권, 캡슐화 또는 빌드 시간 개선을 통한 이점을 얻으려면 모듈화를 고려하는 것이 좋다
https://developer.android.com/topic/modularization