Photo by Rachel Hisko on Unsplash
[Android] Multi Module
Multi Module을 왜 쓰는지, Multi Module에서 버전 관리는 어떻게 하는지 알아봅시다.
모듈
모듈이란?
모듈은 소스 파일 및 빌드 설정으로 구성된 모음이며, 이를 통해 프로젝트를 별개의 기능 단위로 분할할 수 있다.
프로젝트에서 하나 이상의 모듈이 포함될 수 있으며, 하나의 모듈이 다른 모듈을 종속성으로 사용할 수 있습니다. 각 모듈은 개별적으로 빌드, 테스트 및 디버그 할 수 있다.
안드로이드 프로젝트를 만들면 자동으로 생성되는 app도 모듈의 한 종류.
장점
의존성을 줄일 수 있다. (관심사 분리)
기존의 단일 모듈 방식에서는 실수로 의존성 규칙을 위반할 수 있지만 멀티 모듈 방식을 사용하면 build.gradle 파일에서 의존성을 추가하지 않으면 다른 모듈의 코드를 사용할 수 없기 때문에 의존성 규칙을 쉽게 관리 가능.빌드 시간 감소를 기대할 수 있다.
기본적으로 빌드를 할때 변경된 모듈만 빌드하므로 빌드 시간 감소를 기대할 수 있다. 하지만 모듈간 종속성이 복잡해지고 모듈의 수정이 많다면 빌드 시간이 증가될 수 있다.코드 재사용성이 높아진다.
레이어별, 기능별로 모듈을 나눠서 코드를 작성하게되면 해당 기능이 필요할때 해당 모듈에 대한 의존성을 추가해서 사용하면 되기 때문에 재사용성이 높아진다.모듈 단위 테스트를 할 수 있다.
단점
하나의 앱만 있는데, 모듈을 여러개로 나눠놓으면 코드량이 더 많게 느껴진다.
해당 프로젝트를 처음보면 코드 전체를 보고 이해하기 어렵다.
위의 이유로 오히려 빌드 시간이 늘어날 수 있다.
버전 관리
멀티 모듈을 사용하게되면 build.gradle 파일이 여러개 생긴다.
gradle == 빌드 도구(build tool)
빌드도구는 빌드의 모든 과정(컴파일, 테스트, 배포, 문서화 등의 작업을 포함하는 절차)을 자동으로 처리할 수 있도록 도와주는 것이다. 즉 개발을 좀 더 쉽게 할 수 있도록 도움을 준다! 빌드 도구 중 하나가 Gradle이다. Gradle에서 사용되는 언어로는 그루비 기반의 gradle dsl(Domain-Specific Languages, 도메인 특화 언어)를 사용한다.settings.gradle 파일과 build.gradle 파일의 차이
settings.gradle
: 프로젝트의 구성 정보를 기록하는 파일이다. 어떤 하위 프로젝트들이 어떤 관계로 구성되어 있는지를 기술하면 된다.
build.gradle
: 의존성이나 플러그인 설정 등을 하는 파일이다. 빌드 작업에 필요한 기본 설정, 동작 등을 기술하면 된다.
여러개의 build.gradle에서 공통적으로 사용할 변수를 쓴다거나, dependency들의 버전을 통일하고자 할 때 사용할 수 있는 방법들은 여러가지가 있다.
1. ext(extra) 사용
장점
- 간단하다.
단점
- ide 자동 완성이 안되기 때문에 오타를 낼 확률이 있다.
2. Kotlin DSL + buildSrc 사용
장점
- 컴파일 타임에 에러 확인
코드 탐색
자동 완성
구문 강조
IDE의 지원으로 향상된 편집환경
소스코드와 동일한 언어의 사용
단점
빌드 캐시가 Invalidation 되거나 클린 빌드시에 Groovy DSL보다 느리다.
Java8이상에서 동작
새로운 라이브러리 버전 Inspection 기능 미지원
buildSrc 구성 파일에서 버전을 변경하는 경우 Gradle 이 정의한 플러그인을 포함하여 전체 buildSrc 를 재구성한다. (빌드 캐시 무효화)
-> 아래에서 설명하는 version catalog 의 경우 함수 호출의 형태라 상수 값의 변경 여부는 무관하기 때문에, 단순 버전 변경이 일어난다고 해도 리빌드를 하지 않으니 그만큼 시간 절약에 도움이 될 수 있다.
3. Version catalog
장점
IDE 에서 자동 완성을 통해 종속성을 쉽게 추가할 수 있다.
하나의 파일로 모든 모듈의 종속성 버전을 관리할 수 있다.
bundle 을 이용할 수 있다.
참고
https://brunch.co.kr/@purpledev/43
velog.io/@dabin/%EC%95%88%EB%93%9C%EB%A1%9C..
hhyeok1026.tistory.com/38
velog.io/@7lo9ve3/gradle
brunch.co.kr/@oemilk/221