모듈은 소스 파일 및 빌드 설정으로 구성된 모음이며, 이를 통해 프로젝트를 별개의 기능 단위로 분할할 수 있다. 프로젝트에서 하나 이상의 모듈이 포함될 수 있으며, 하나의 모듈이 다른 모듈을 종속성으로 사용할 수 있다. 각 모듈은 개별적으로 빌드, 테스트 및 디버그 할 수 있다.
여러 앱을 빌드할 때, 일부 동일한 구성 요소를 재사용할 때 유용하다.
또한 앱에 새로운 기능을 추가할때 기존 코드에 기능을 추가하려면 힘이 더 들지만, 새로운 기능을 위한 모듈을 따로 만들고, demoapp 을 만들어서 테스트하면 훨씬 쉽다. 만약 기존 앱의 domain, data 계층이 모듈화 되어있다면 기존앱의 리소스들을 그대로 가져다가 테스트할 수 있으므로 유용하다.
(1) 이 기능이 조금이라도 다른 앱에 이용될 수 있는 가능이성이 있을때
(2) 이 기능이 잘 된다면 별도의 앱이 될 수 있다고 생각이 될떄
(3) 이 기능이 너무 커서 demo가 실제 기능이 될 때 까지 오랜시간이 걸릴다고 판단될때
(4) 기존 앱이 너무 무거워서 개발할때 앱을 자주 빌드해서 확인하기 버거울 때
(1) 코드 재사용성이 높아진다
(2) 의존성이 적은 코드를 작성할 수 있다.
(3) 모듈 단위의 코드 수정이 용이하다.
(4) 모듈 단위 테스트를 할 수 있다.
(5) 빌드 시간 감소 가능
빌드 시간 감소 '가능'
기본적으로 빌드를 할때 변경된 모듈만 빌드하므로 빌드 시간 감소를 기대할 수 있다.
하지만! 모듈간 종속성이 복잡해지고 모듈의 수정이 많다면 빌드 시간이 증가될 수 있다. 또한 Dagger 같은 AnnotationProcessor 를 사용할때도 빌드 시간이 증가한다.
(1) 하나의 앱만 있는데, 모듈을 여러개로 나눠놓으면 코드량이 더 많게 느껴진다.
(2) 해당 프로젝트를 처음보면 코드 전체를 보고 이해하기 어렵다.
(3) 위의 이유로 오히려 빌드 시간이 늘어날 수 있다.
두개 이상의 앱을 서비스 하고 있거나, 여러 개의 앱으로 분리될 경우를 대비하고 싶은 경우에 잘 변하지 않는 기능/독립적으로 구성가능한 기능을 모듈화 하는게 좋다.