
이전 글에서 BuddyCon 프로젝트에 적용한 클린 아키텍처에 대해 정리를 하였습니다. 관심 있으신 분들은 한번 참고해보시면 좋을 것 같습니다.
프로젝트로 배우는 클린 아키텍처
이제 아키텍처를 정했으니 각 계층 별로 역할을 분리해야합니다. 계층별로 패키지를 생성해서 분리 시키는 방법도 있지만, 저희는 각 계층을 하나의 모듈로 만들어서 모듈화를 적용시켜보고자 하였습니다. 이번 글을 통해 모듈화를 적용시킴으로써 생기는 장단점을 확인해보신 후에 프로젝트의 특성에 맞게 적용해보는 것도 좋을 것 같습니다.
하나의 App 모듈에서 여러 차례 버전이 업데이트 되면서 다양한 비즈니스 로직을 반영하고 삭제하고 여러 기능들이 추가되면서 코드의 양도 방대해지고 복잡해지기 마련입니다. 즉, 시간이 지남에 따라 복잡성, 가독성 및 코드 품질이 떨어지고 유지보수의 어려움만 증대되게 됩니다. 이러한 문제를 해결해줄 수 있는 방법이 모듈화를 적용시키는 방법입니다.
모듈화는 각 모듈별로 독립적이게 구성하고 서로 연관된 모듈간에는 느슨한 결합을 통해 구성하는 방법입니다. 모듈별로는 기능 및 역할이 명확해야 하며 다른 모듈의 변경에 영향이 없도록 독립적으로 구성되어야 합니다. 또한, 프로젝트의 규모가 점차 커지면서 모듈의 크기도 커지는 것을 대비하여 더 작고 세분화된 모듈화를 적용시키면 대형 시스템 설계와 유지보수에 도움이 됩니다.

재사용성
모듈은 각 기능별 역할을 담당하기에 다른 프로젝트나 테스트 앱에서도 재사용을 할 수 있습니다. 예를 들어 네트워크 요청을 담당하는 모듈 같은 경우 다른 프로젝트에서도 비슷하게 사용할 가능성이 높기 때문에 모듈을 가지고 와서 사용해도 무방합니다.
캡슐화
외부에서 세부적인 구현을 알지 못하도록 캡슐화를 적용할 수 있습니다.
상태 공개 제어
internal, public, private 등을 통해 다른 모듈에서 사용하지 못하도록 막을 수도 있습니다.
확장성
모듈화를 적용시키지 않는 프로젝트에서는 하나의 변경사항이 다른 부분까지 변경을 해야하는 변경의 전이 현상이 발생할 수 있습니다. 모듈화가 적용되어 있을 떄는 관심사 최대한 분리하기에 변경의 전이 현상이 최소화됨으로 확장성 면에서 자율적으로 할 수 있습니다.
테스트 가능성
테스트 시에 원래의 모듈이 아닌 테스트용 Mock 모듈을 적용하여 핵심 로직이 있는 모듈들의 테스트 가능성을 높일 수 있습니다.
빌드 시간
증분 빌드, 빌드 캐시 등 Gradle의 기능을 활용하여 빌드 시간을 단축시킬 수 있습니다.
모듈화가 꼭 장점만 있는 것은 아닙니다. 프로젝트의 규모가 큰 경우에는 더 세분화하게 모듈을 나눠도 좋지만, 그게 아니라면 복잡성만 증대시키는 방향으로 흘러갈 수 있습니다.
각 모듈들은 명확한 역할이 구분되어야 하며 다른 모듈과의 관련없이 독립적으로 기능을 수행할 수 있어야합니다. 이를 응집도가 높다라고 표현을 하며, 모듈의 변경이 다른 모듈의 변경으로 전이가 되지 않도록 의존성 및 연관성을 최소화하여야 합니다. 이를 결합도가 낮다라고 표현을 합니다.
데이터 모듈은 일반적으로는 Repository, DataSource, Model 클래스들이 존재합니다. 하지만 이건 구글 권장 아키텍처일 때의 이야기일 것 같고 클린 아키텍처를 선택하고 모듈화를 적용시킨다면 데이터 모듈에는 DataSource와 Repository 구현체들이 있어야 합니다.

기능 모듈은 각 세부적인 화면 단위로 기능들을 분리하여 역할을 구분하는 모듈을 의미합니다. 예를 들어 회원가입 화면 또는 로그인 화면 단위로 나누어서 독립적인 기능들을 하는 모듈로 나눌 수 있습니다.

기능 모듈은 보통 데이터 모듈에 의존하여 데이터 소스로부터 데이터를 받아와 화면을 보여줍니다.
앱 모듈은 애플리케이션의 진입점에 해당하는 모듈입니다. 안드로이드 프로젝트를 실행시키면 기본적으로 app 모듈이 만들어지는데 이 모듈이 앱모듈로서 담당하게 됩니다.
만일, 모바일 앱 뿐만 아닌 태블릿, 웨어러블까지 지원을 한다면 여러 앱 모듈을 만들고 각 앱 모듈에서 필요한 모듈들만 참조하여 빠르게 앱을 개발할 수도 있습니다.

각 모듈별로 이름만 보더라도 명확하게 어떤 역할인지 알 수 있을 것 같습니다. 위에 소개드린 모듈말고 프로젝트의 특성에 맞게 모듈화를 적용시켜서 각 모듈의 역할만 구분지을 수 있다면 정답을 없다고 생각합니다 :)
BuddyCon은 클린 아키텍처를 적용하기로 하였고 프로젝트의 규모가 매우 작기 때문에 모듈화를 적용할 필요는 없지만 공부차원으로 data, domain, presentation 모듈로 나누어서 해보기로 하였습니다~
관심 있으신분들은 참고해보면 좋을 것 같습니다.
https://github.com/Team-BuddyCon/ANDROID
https://developer.android.com/topic/modularization/patterns?hl=ko