최근에 회사에서 프로젝트를 진행하며 신입 때 작성했던 코드를 수정해야 하는 일이 생겼습니다. 첨부파일 업로드, 다운로드 관련 기능을 제공하는 클래스들이었는데, 당시 아키텍처에 대한 개념이 별로 없던 시절이라 코드가 구조화되지 않고 여기저기 흩어져 있었습니다. Helper, Manager와 같은 이름을 가진 클래스들이 데이터베이스를 직접 접근하여 클래스 사이의 의존성 또한 매우 높았습니다.
코드를 수정하며 느꼈던 생각이 '기존에 프로젝트를 진행하던 인원이 아닌 새로운 인원이 프로젝트에 투입돼도 어떻게 하면 의존성 규칙을 잘 지키면서 구조화된 기능을 구현할 수 있을까?'였습니다. 다른 사람들은 이와 같은 문제를 어떻게 해결했는지 검색해본 결과 클린 아키텍처와 멀티 모듈이 많이 나왔습니다. 그중 오늘은 멀티 모듈에 대해서 글을 작성하려 합니다.
모듈이란?
멀티 모듈에 설명하기 앞서 모듈이 무엇인지부터 짚고 넘어가겠습니다. 모듈은 안드로이드 공식 사이트에 다음과 같이 정의되어 있습니다.
모듈은 소스 파일 및 빌드 설정으로 구성된 모음이며, 이를 통해 프로젝트를 별개의 기능 단위로 분할할 수 있습니다. 프로젝트에는 하나 이상의 모듈이 포함될 수 있으며, 하나의 모듈이 다른 모듈을 종속 항목으로 사용할 수 있습니다. 각 모듈은 개별적으로 빌드, 테스트 및 디버그 할 수 있습니다.
위의 설명처럼 모듈은 소스 파일과 빌드 설정으로 구성된 모음입니다. 안드로이드 스튜디오에서 새로운 프로젝트를 만들면 생기는 app도 모듈의 한 종류입니다.
모듈을 추가하는 방법은 간단합니다. 안드로이드 스튜디오에서 [File > New > New Module]을 누른 뒤, 원하는 모듈을 선택하면 됩니다.
모듈의 종류는 여러 가지가 있습니다. 그중에서 대표적인 3가지만 설명하겠습니다.
Application
안드로이드 프로젝트를 만들 때 기본으로 생성되는 app 모듈은 Application 모듈입니다. 빌드의 결과로 APK 파일을 생성합니다. 앱을 실행하기 위해선 Application 모듈이 반드시 필요합니다.
Android Library
안드로이드 프로젝트에서 지원되는 모든 파일 형식을 포함할 수 있습니다. 다른 Application 모듈의 종속 항목으로 추가할 수 있습니다. 빌드의 결과로는 AAR 파일이 생성됩니다.
Java or Kotlin Library
이름 그대로 순수한 Java 혹은 Kotlin으로만 이루어진 모듈입니다. 안드로이드 프레임워크로부터 독립적인 기능을 구현할 때 사용합니다. 빌드의 결과로는 JAR 파일이 생성됩니다.
멀티 모듈 프로젝트란?
멀티 모듈 프로젝트란 이름 그대로 여러 개의 모듈이 모여서 동작하는 프로젝트를 뜻합니다. 보통 특정 기능을 하나의 모듈로 묶어서 모듈화를 진행합니다. 데이터베이스에 접근하는 DB 모듈, View와 ViewModel을 포함하는 Presentation 모듈 등이 대표적입니다.
그럼 멀티 모듈은 왜 해야 하는 걸까요? 그냥 하나의 app 모듈에 모든 기능을 넣어도 문제가 없는데 굳이 할 필요가 있을까요? 물론, 간단한 앱이라면 굳이 멀티 모듈로 프로젝트를 구성할 필요는 없습니다. 하지만 다수의 개발자가 참여하는 큰 사이즈의 프로젝트라면 코드도 굉장히 많고 복잡한 구조를 가지게 될 것입니다. 프로젝트가 커지게 되면 여러 가지 문제가 발생할 수 있습니다.
1. 의존성이 높아질 수 있다.
위의 사진은 MVVM 패턴을 설명할 때 많이 사용되는 사진입니다. 프로젝트를 진행하며 위의 사진과 같이 MVVM 패턴에 맞게 의존성 규칙을 정했다고 가정합니다. ViewModel에서는 Repository를 통해 데이터를 가져오고, Repository에서는 데이터베이스에 접근해서 데이터를 가져온다는 등의 규칙입니다.
의존성 규칙을 잘 정했다고 하더라도 app 모듈 안에서 모든 기능을 구현하는 모놀리틱 프로젝트에서는 규칙을 위반하는 실수가 나오기 쉽습니다. 예를 들면, Activity에서 데이터베이스 인스턴스에 접근하여 데이터를 가져올 수 있습니다. 이는 개발자의 실수이긴 하나, 하나의 모듈로 프로젝트가 구성되어 있기 때문에 모든 코드에 접근할 수 있어서 생기는 문제입니다.
관심사를 분리하기 위해선 의존성 규칙을 잘 지켜주어야 합니다. 멀티 모듈 프로젝트에서는 build.gradle 파일에 사용할 모듈의 의존성을 직접 추가해줌으로써 사용하지 않는 모듈들은 접근조차 할 수 없게 됩니다.
2. 빌드 속도가 늘어난다.
프로젝트 사이즈가 커짐에 따라 빌드 속도가 늘어나는 것은 어쩔 수 없는 일입니다. 하지만 멀티 모듈 구조로 프로젝트를 구성하면 빌드 속도를 단축시킬 수 있습니다.
프로젝트를 빌드할 때 변경된 모듈만 빌드하기 때문에 모듈이 많을수록 빌드 시간이 단축되는 효과를 얻을 수 있습니다.
3. 코드 재사용성
만약 Application 모듈이 여러 개라면 얻을 수 있는 장점입니다. 예를 들어, A 프로젝트에서 CustomView를 하나 만들어서 사용하고 있었다고 합니다. B 프로젝트에서도 이 CustomView를 사용하려고 하면, 보통은 복사, 붙여 넣기로 코드를 통째로 가져오게 됩니다.
이때 CustomView의 문제점이 발견되어 코드를 수정해야 한다고 하면, A 프로젝트와 B 프로젝트 모두 수정해야 하는 번거로움이 생깁니다.
위의 사진처럼 CustomView를 모듈화 시켜서 A 프로젝트와 B 프로젝트에서 사용한다고 하면, 문제점이 발견되어도 CustomView만 수정하면 돼서 코드 재사용성이 좋아지게 됩니다.
멀티 모듈로 프로젝트를 구성한다고 해서 장점만 있는 것은 아닙니다. 처음 멀티 모듈을 구성할 때는 다소 어색하고 어려울 수 있습니다. 또한 클래스들과 디렉토리가 굉장히 많아집니다. 아래의 사진은 7개의 모듈로 구성된 프로젝트의 build.gradle 파일들입니다. 관리해야 하는 파일들이 많아지고, 특정 파일을 찾을 때 디렉토리 사이에서 방황할 수 있다는 단점이 있습니다.
끝으로
멀티 모듈을 공부하고 적용하는 과정은 많은 시간이 할애되었습니다. 처음 적용할 때는 어떤 식으로 구조를 잡아야 할지, 의존성은 어떻게 넣어주어야 할지 어려운 부분이 많았습니다. 하지만 멀티 모듈을 통해 관심사와 의존성 문제를 해결할 수 있었습니다. 이와 같은 문제를 해결하는 방법으로 멀티 모듈을 추천해드립니다.
참고
https://footcode.postype.com/post/3673100
'Android' 카테고리의 다른 글
[Android] Tree 구조를 RecyclerView로 만들어보자 - TreeAdapter (6) | 2021.07.03 |
---|---|
[Android] Paging 3.0 Library 알아보기 - 1 (0) | 2021.06.27 |
[Android] Event Wrapper를 사용한 단일 이벤트 처리 (1) | 2021.06.20 |
[Android] Kotlin으로 안드로이드 개발 시 테스트 하는 법 - MockK (0) | 2021.05.26 |
[Android] Sticky Header RecyclerView 응용하기 (0) | 2021.04.19 |