Nia 03. Modurization

동훈이·2023년 3월 3일
0

nia

목록 보기
3/3
post-thumbnail

두번째 Nia 분석으로는 아키텍처 다음으로 관심을 가질만한 모듈에 대해서 알아보도록 하겠습니다.

기본적인 안내는 아래 링크에서 Nia 에서 어떤 기준으로 module 어떻게 구성하였는지에 대해서 서술하고 있고 본 게시글에서는 간단한 저의 의견과 함께 이야기를 나눠보려고 합니다.
https://github.com/android/nowinandroid/blob/main/docs/ModularizationLearningJourney.md

모듈화가 뭐에요?

모듈화란 프로그래밍에서 코드를 기능별로 분리하는 것을 말합니다. 이를 통해 코드의 재사용성을 높일 수 있으며 유지보수가 용이해집니다. 모듈화는 큰 프로그램을 작은 단위로 나누어 개발하고, 각 단위를 독립적으로 테스트하고 관리할 수 있도록 합니다. 모듈화를 통해 작성된 코드는 다른 프로그램에서도 쉽게 사용될 수 있으며, 필요한 모듈만 불러와서 사용할 수 있습니다.

💡 복잡하고 어렵기만 해보이는데 왜 사용 할까요?

  1. 확장성(Scalability): 안드로이드 앱 개발에서 모듈화는 화면마다 기능을 분리하여 개발할 수 있도록 합니다. 이를 통해 새로운 화면을 추가하거나 수정하는 것이 더욱 쉬워지며, 앱의 확장성이 높아집니다.

  2. 캡슐화(Encapsulation): 안드로이드 앱에서 모듈화는 코드를 기능별로 분리하여 캡슐화할 수 있습니다. 이를 통해 외부에서 모듈 내부의 코드에 직접적으로 접근하는 것을 방지할 수 있으며, 안정성을 높일 수 있습니다. 아키텍처가 이와 깊게 관련이 있습니다.

  3. 빌드시간 단축(Build Time Reduction): 안드로이드 앱 개발에서 모듈화는 빌드 시간을 단축할 수 있습니다. 그레들은 변경된 모듈만 리빌드를 하는데 모듈화를 해놓으면 빌드타임이 줄어듭니다.

  4. 재사용성(Reusability): 안드로이드 앱 개발에서 모듈화된 코드는 다른 앱에서도 쉽게 사6될 수 있습니다. 이를 통해 코드의 중복을 줄여 코드 퀄리티를 높힐 수 있습니다.

이부분에서 제가 가장 중요하다고 생각하는 부분은 빌드시간 단축입니다. 실제로 개발을 열심히 할때는 문제가 없지만 버그 수정을 하거나 간단한 테스트를 위한 부분 수정의 경우 빌드 횟수가 잦다는걸 알 수 있습니다. 그때 앱 전체를 빌드를 하냐 아니면 해당 모듈만 빌드를 하냐에 따라 차이가 크고 생각보다 많은 시간을 절약 할 수 있다는 걸 알 수 있습니다.

💡 빌드타임 얼마나 절약 될까요?

그레들은 변경된 모듈과 그 모듈의 의존성을 가진 모듈만 다시 컴파일합니다. 이것은 그레들이 내부적으로 각 모듈 간의 의존성 관계를 추적하고 변경된 부분만 다시 빌드하고 있습니다. 이는 그레들의 캐시 메커니즘과도 관련이 있는데, 그레들은 이전에 빌드된 모듈의 결과를 캐시에 저장하여 다음 빌드 때 재사용합니다. 따라서, 변경된 부분만 다시 빌드하여 빌드 시간을 최소화할 수 있습니다.

위 사진을 설명하면 세로축은 빌드타임, 가로축은 모듈의 갯수입니다. 생각보다 많은 빌드타임이 줄어드는 걸 볼 수 있습니다. 하지만 이 사진으로 모듈화를 설명하기에는 함정이 2가지 있습니다.

  1. 의존성: 만약 모듈화를 했더라도 변경된 모듈이 다른 모듈에 의존하는 경우, 의존하는 모듈도 함께 다시 컴파일해야 합니다. 즉, 모듈화를 많이 하였더라도 의존성이 끈끈한 모듈을 수정하였다면, 그와 연관된 모든 모듈이 다같이 컴파일되기에 빌드타임이 획기적으로 줄어드는걸 볼 수는 어렵습니다

  2. 모듈 사이즈: 우리가 가장 많은 코드를 기여하는곳은 Ui Layer 입니다. Data, Domain 을 많이 나눈다고 해도 UiLayer 를 모듈화 하지 않으면 큰 효과를 보기는 어려울 수 있습니다. 물론 이 부분은 Ui Layer에 한정지어서 이야기 하는게 아닌 사이즈가 큰 모듈에 대해서 이야기를 하고 있습니다.

💡 그럼 단점은 없을까요?

  1. 비용과 시간: 안드로이드 애플리케이션은 많은 수의 라이브러리와 의존성을 가지고 있습니다. 이 때문에, 새로운 모듈이 추가될 때마다 이전 모듈들과의 의존성 관리가 어려울 수 있습니다. 또한, 라이브러리와 의존성이 업데이트될 때마다 이를 관리해야 하므로, 비용과 시간이 많이 소모될 수 있습니다.

  2. 설계의 비용: 안드로이드에서 모듈화는 개발자들이 추가적인 작업과 리소스를 투입해야 합니다. 모듈화된 코드를 만들기 위해서는 모듈 간의 인터페이스를 설계하고, 의존성을 관리하는 데 추가적인 작업이 필요하기 때문입니다.

  3. 완성도: 안드로이드 애플리케이션에서 모듈 간의 상호작용을 설계하고 구현하는 것은 매우 중요합니다. 잘못된 인터페이스 설계는 모듈 간의 상호작용이 어려워지며, 코드의 유지보수성과 재사용성이 떨어질 수 있습니다.

사실 모듈화의 단점으로는 얼마나 내 프로젝트를 잘 이해하냐에 따라 단점이 덜 할 수도 있고, 없을 수도 있습니다. 물론 모듈이 많이 늘어남에 따라 복잡도가 올라가지만 그만큼 장점으로 얻는게 많기에 이제는 사실 조금의 모듈 분리정도는 진행을 필수로 가져가야 하지 않을까 라는 생각이 듭니다.

Nia 는 어떻게 모듈을 구성하였을까?

위 사진은 Nia 프로젝트의 모듈을 그림으로 나타내었으며, 앱을 구성하는 일부분만 발췌하여 그린 그림을 가져왔습니다.

앱 모듈은 앱이 작동하게 하는 모든 것을 통합하여 관리하는 모듈입니다. 대표적으로는 MainActivity, NiaApp 이 있으며, 기본적인 앱 자체의 네비게이션을 관리하고, 관련 코드베이스가 포함되어 있습니다.

💡 앱 모듈은 모든 기능 모듈 및 필요한 코어 모듈에 의존합니다.

기능 모듈은 특정 기능 또는 UI, ViewModel 을 포함하는 모듈입니다. 화면 단위로 모듈을 분리하고 구성하고 있습니다.

💡 기능 모듈은 다른 기능 모듈에 의존하지 않습니다. 필요한 코어 모듈에만 의존합니다.

코어 모듈은 보조 코드 및 기타 모듈에서 공유해야 하는 특정 종속성이 포함된 공통 라이브러리 모듈입니다. 여기서 특이한 점은 각 클래스에서 사용하는 모델을 하나의 모듈로 만들어 관리하고 있다는 점입니다.

💡 다른 코어 모듈에 의존할 수 있지만, 기능 모듈이나 앱 모듈에는 의존해서는 안 됩니다.

기타 모듈 - sync, benchmark 및 test 모듈과 함께 디자인 시스템을 빠르게 표시하는 앱-nia-catalog과 같은 기타 모듈이 있습니다.

이미지 참고 : https://susuthapa19961227.medium.com/super-charge-build-time-in-multi-module-project-with-gradles-dependency-resolution-96b7ddb865dc

profile
안드로이드 개발자

0개의 댓글