커스텀 플러그인과 Hilt 모듈

Ham's Velog·2023년 10월 27일

알람앱구현

목록 보기
1/4
post-thumbnail

이 시리즈의 목표 !

멀티 모듈의 프로젝트를 더 자세하게 알아보고 알람이 어떻게 만들어지는지, Hilt를 어떻게 더 잘 사용할수 있을지 등 고민 했던 경험들을 아카이빙 하기위해 글을 남겨봅니다.
PS. 저도 많이 배우는 중이라 피드백은 항상 환영하겠습니다. :)


구현 목표

알람을 생성하고 설정된 시간에 알람앱이 실행되게 하라.
(단, 앱이 포그라운드에 존재하지 않아도 실행이 되어야한다.)

프로젝트 구조

  • 프로젝트의 구조는 클린 아키텍처 + 멀티 모듈의 형태를 가진다.
  • 모듈 소개
    • App
    • Data
    • Domain
    • Presentation
    • Alarm
    • BuildSrc
  • 기술 소개
    • KotlinDSL
    • Compose
    • Hilt
    • MVVM
    • AlarmManager

1단계 모듈 설정


모듈을 설정하는 단계부터 큰 난항을 겪었다. "우선 프로젝트의 Groovy로 만들어진 Gradle을
Kotlin DSL로 마이그레이션 해보자!"
하고 신기한게 많아서 이상한짓을 했었다.

커스텀 플러그인 이야기

생애 처음으로 안드로이드 스튜디오에서 Gradle에 대해 조금 들여다 보는 시간을 가진것 같다. 항상 궁금했던 것들

  • 프로젝트 모듈 수준의 Gradle은 무엇을하는걸까?
  • 각 모듈 수준의 Gradle에는 왜 Plugin이 또 존재하는거지?
  • 각 모듈 수준의 Gradle에 Plugin이 존재하는데 Dependencies에 왜 또 작성을 해야하는걸까?

라는 의문점들이 있었다. 필자는 이 궁금증들을 커스텀 플러그인을 만들면서 우연찮게 어느정도 이해가 되었다.

위 사진은 buildSrc 모듈에 존재하는 파일들이다. Kotlin DSL로 커스텀 플러그인을 만들때 중요한 점은 빨간색 박스로 만들어진 녀석들이다. 두 녀석들이 만들어지면 모듈 단위의 Gradle에서 아래 코드처럼 커스텀 플러그인을 사용할 수 있다.

plugins { // 실제 Presentation 모듈에서 사용되는 plugins
    id("com.android.library")
    id("kotlin-android")
    id("kotlin-kapt")
    id("coroutines")
    id("rooms")
    id("com.google.dagger.hilt.android")
}

커스텀 플러그인을 발견한 필자는 "자주 사용되는 의존성들을 묶어서 플러그인 하나로 사용해볼까?" 하는 취지로 간단하게 커스텀 플러그인을 구현해보았다. 그중 CoroutineHilt를 시도했었는데 현재 Hilt는 빠져있고 presentation 모듈과 취지가 맞지않은 Room이 존재한다. 그 이유는 Hilt 플러그인을 만들때 딜레마에 빠져서 커스텀 플러그인 패스 해버렸고, Room 플러그인을 만들었을 때 급하게 presentation 모듈에서 테스트를 하다가 실수로 넣어놓았다. (뺄 예정..)

그래도 해당 딜레마를 겪으면서 커스텀 플러그인 제작 방법플러그인만으로 각 모듈마다 추가해야 될 의존성들을 나누는 방법까지 터득하였다.

Hilt 의존성 딜레마 이야기

힐트 의존성

  • com.google.dagger:hilt-android-compiler
  • com.google.dagger:hilt-android
  • com.google.dagger:hilt-core

'클린 아키텍처라면 Domain 모듈에서는 android 관련 의존성을 부여하면 안될텐데?' 라는 생각에서 딜레마가 시작이 되었다. 각각의 의존성을 모듈마다 어떤것을 넣어주는게 올바른지 의존성 부여인지 찾아보았다.

안드로이드 프레임워크 클래스를 사용하는 모듈일 경우

  • com.google.dagger:hilt-android
  • com.google.dagger:hilt-android-compiler

비즈니스 로직 혹은 데이터 처리 로직만을 수행하는 모듈일 경우

  • com.google.dagger:hilt-core
  • com.google.dagger:hilt-android-compiler

app, presentation, alarm 모듈에서는 hilt-android를 사용하고 domain 모듈에서는 hilt-core를 사용하면 되겠다고 생각을 하였다. 그런데 필자는 'data 모듈에서는 hilt-androidhilt-core중 무엇을 사용해야 할까?' 라는 생각에서 'Room을 사용 한다면 data 모듈에서 사용을 할것이고, Room은 안드로이드 의존성을 가지면서 Room을 활용하여 DI 패턴을 만든다고 가정하면, data 모듈에는 hilt-android가 들어가야겠구나!' 라는 생각으로 hilt-android 의존성을 추가하였다.

이러한 생각을 정리하여 커스텀 플러그인을 만들고 플러그인에 등록하였을때 domain 모듈에
hilt-android의존성을 추가하는 코드를 넣어 이상한 오류를 겪었다. 기억하기로는 '해당 Gradle에 android 의존성이 없어 추가할수 없다'는 오류였던것 같았다. 이 오류를 겪고 3시간동안 삽질한 끝에 해결이 되었다.

다음 포스팅에서는 AlarmManager의 알람 생성 메서드 에 대해 알아볼 것이다. 알람 앱을 만들기 위해서 안드로이드는 해당 객체를 사용하도록 권장하고 있다. 어떤 알람 생성 메서드들이 있는지 탐구해보자.

profile
#안드로이드개발자

0개의 댓글