-
[Android] 안드로이드 모듈화 Modularization 적용하기AOS 2023. 3. 4. 19:00반응형
플레옹 프로젝트의 MVP 기능을 개발하면서 하나의 app 모듈에서 개발하였다.
😰
기능이 점점 많아지면서 코드 규모가 매우 커졌고 내가 내 코드를 보아도 복잡할만큼 난잡해졌다. 또한 앱이 커지면서 지속적으로 빌드시간이 증가하였다. 추후에 이 많은 기능들을 관리하려면 모듈화는 필수적이였다.
그래서 중간발표가 끝나고 UI 수정작업을 하면서 모든 기능들을 모듈화였다.
모듈화를 한 뒤로 유지 보수 하는데 훨씬 간편했으며 빌드 시간도 개선되었다. 서비스가 성장해갈 수록 모듈화는 필수적이다.
Android 공식문서의 Android 앱 모듈화 가이드를 참고하였다.
모듈은 app 모듈, feature 모듈, core 모듈 세가지로 분리하였다.
** MY MODULE **
1. 앱 모듈 (app module)
app 모듈은 앱의 진입점으로 모든 기능 모듈에 종속되며 앱의 완전한 그래프를 제공한다.
app/res/navigation/nav_pleon.xml
<?xml version="1.0" encoding="utf-8"?> <navigation xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/nav_pleon" app:startDestination="@id/nav_feed"> <include app:graph="@navigation/nav_login"/> <include app:graph="@navigation/nav_plant_register"/> <include app:graph="@navigation/nav_garden"/> <include app:graph="@navigation/nav_doctor"/> <include app:graph="@navigation/nav_feed"/> <include app:graph="@navigation/nav_my"/> </navigation>
각 feature 모듈에는 각 기능의 navigation이 있다. (nav_feed, nav_doctor, nav_garden 등등)
이 id를 설정하면 bottom navigation에 연결할 수 있다.
app/res/menu/bottom_navigation.xml
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@id/nav_feed" android:icon="@drawable/tab_selector_feed" android:title="@string/bottom_nav_feed" /> <item android:id="@id/nav_doctor" android:icon="@drawable/tab_selector_doctor" android:title="@string/bottom_nav_doctor" /> <item android:id="@id/nav_garden" android:icon="@drawable/tab_selector_garden" android:title="@string/bottom_nav_garden" /> <item android:id="@id/nav_my" android:icon="@drawable/tab_selector_my" android:title="@string/bottom_nav_my" /> </menu>
2. 피처 모듈(feature module)
피처 모듈은 독립적인 기능을 분리한다. 특히 앱의 bottom navigation을 분리한다.
feed, garden, doctor, feed-common, plant-register, login, my 로 7개의 모듈을 생성하였다. 보통 feature module은 view와 viewmodel로 구성되어있다.
내 프로젝트의 bottom menu는 feed, garden, doctor, my 로 총 4개이다.
이 4개의 모듈을 포함하고 나머지 독립적인 기능인 login, plant-register 2개의 모듈을 더 생성하였다.
나머지 1개 feed-common 모듈은 개발하다가 생성된 모듈이다. feed-common은 피처모듈이자 일반모듈이다.
feed, doctor, garden에서 공통적으로 사용하는 feed adapter와 doctor adapter 가 있었다.
common 모듈에 두기에는 recyclerview는 안드로이드를 알고 있었고, common-ui에 두기에는 common-ui는 common의 data class 등을 참조하고 있지 않아 둘다 불가능했다. 그래서 feed-common 모듈을 생성하게되었다.
3. 일반 모듈(common module, core module)
일반 모듈은 다른 모듈에서 자주 사용하는 코드가 포함된다. common, common-ui, foundation 모듈 3가지를 생성했다.
common 모듈은 안드로이드와 관련없이 만들어 안드로이드 프레임워크와 독립적인 기능을 담았다. data, repository, network 등으로 구성하였다.
common-ui는 앱의 맞춤 UI를 모든 기능에서 재사용할 수 있도록 캡슐화 한 것이다. 이를 이용하면 기능들의 UI를 일관되게 만들 수 있다. 또한 UI 수정할 때 간편하게 바꿀 수 있다.
foundation 모듈은 어떠한 앱이든 가져가 사용할 수 있는 독립적인 모듈이다. (network 담당)
모듈화의 장점
- 재사용 및 확장성 : 코드를 공유하고 동일한 기반인 여러앱을 빌드할 수 있다. 또한 동일한 UI를 재사용하여 일관되게 만들 수 있다.
- 유지보수 : 모듈의 역할히 잘 구분되어 있을 수록 디버깅이나 새로운 기능을 개발할 때 어디를 수정해야할지 빠르게 파악할 수 있다.
- 빌드 시간 단축 : 전체 앱을 빌드 하는데 1분 52초가 걸리는데 변경된 모듈이 있을 때 빌드 시간은 14초로 단축되었다. 이는 app 모듈에 모든 코드가 있는 것보다 모듈화를 하였을 때 빌드 시간이 단축되고 프로젝트의 생산성이 높아짐을 확인할 수 있다.
참고)
https://developer.android.com/topic/modularization/patterns?hl=ko
반응형'AOS' 카테고리의 다른 글
[Andorid] local.properties를 이용하여 API URL, KEY 안전하게 숨기기 (0) 2023.06.13 [Android] 무한스크롤 Infinite Scroll (0) 2023.05.17 [Android] 이미지 라이브러리(glide)없이 URL로 이미지 나타내기 (0) 2023.05.12 [Android] LiveData 와 Observer Pattern (0) 2023.03.20 [Kotlin] MpAndroidChart 사용하기 / 클릭하면 x축 label 출력 (0) 2022.01.05