다중 모듈 프로젝트에서 Dagger2에서 Hilt로 마이그레이션

May 10 2023
다중 모듈 프로젝트에서 Dagger에서 Hilt로 마이그레이션하기 위한 단계별 가이드입니다. 프로젝트 구조 프로젝트를 시각화하기 위해 NetworkModule, StorageModule, CommonModule, FeatureModule 등 여러 모듈을 포함합니다.

다중 모듈 프로젝트에서 Dagger마이그레이션 하기 위한 단계별 지침입니다 .Hilt

Unsplash의 Saif71.com 사진

프로젝트 구조

프로젝트를 시각화하기 위해 NetworkModule, StorageModule, CommonModule, FeatureModule 등 여러 모듈이 포함되어 있습니다. 실제 프로젝트에는 더 많은 모듈이 있을 수 있지만 다음 모듈로 제한됩니다.

마이그레이션 전략

Dagger우리는 완전히 마이그레이션하기 를 원 Hilt하지만 실제로는 프로젝트를 먼저 마이그레이션한 app다음 Hilt다른 모듈로 마이그레이션하는 증분 접근 방식이 필요합니다. 즉, 전체 마이그레이션이 완료될 때까지 일정 시간 동안 병렬로 작업해야 합니다 Dagger.Hilt

버전

Dagger 2.24이 스토리는 에서 로 마이그레이션을 수행합니다 Hilt 2.45.

콘텐츠

  • 구성/준비
  • 앱 구성 요소 및 싱글톤 마이그레이션
  • 애플리케이션 클래스 마이그레이션
  • 활동 클래스 마이그레이션
  • 조각 마이그레이션
  • ViewModel 마이그레이션
  • 마이그레이션 후 정리
  • 요약 및 시사점

Hilt다음 종속성을 앱 Gradle의 build.gradle파일 에 통합하려면

또한 파일 에서 kaptcorrectErrorType을 설정하도록 구성합니다.truebuild.gradle

dependencies {
  implementation 'com.google.dagger:hilt-android:2.45'
  kapt 'com.google.dagger:hilt-compiler:2.45'
}
// Allow references to generated code
kapt {
    correctErrorTypes = true
}

plugins {
    // other plugins
    id 'com.google.dagger.hilt.android' version '2.45' apply false
}

plugins {
    // other plugins
    id 'com.google.dagger.hilt.android'
}
android {
    ....
}

앱 구성 요소 마이그레이션

Dagger에는 Singleton Component앱 또는 프로젝트의 다른 모듈에서 생성된 모든 Dagger 모듈이 포함되며 일반적 AppComponent으로 Dagger.

현재 AppComponent.kt 파일을 살펴보겠습니다.

마이그레이션하려면 각 모듈(예: NetworkModule , StorageModule 등)을 for 에 Singleton Component설치해야 합니다 . 모든 개별 모듈에 주석을 달아 이를 수행할 수 있습니다. 하지만 많은 모듈이 있는 경우 모든 모듈을 한 번에 변경하는 것은 좋지 않지만 대신 주석이 달린 AggregatedModule을 만들고 주석 이 달린 모든 모듈을 포함합니다 .SingletonComponentHilt@InstallIn(SingletonComponent::class)@InstallIn(SingletonComponent::class)Dagger@Module(includes = [ <all of these modules > ])

프로젝트를 실행하면 오류가 발생합니다

DisableModuleHasInstallInCheck 오류

프로젝트를 실행한 후 annotated with 에 포함된 각 모듈에 대한 주석을 Hilt찾으려고 시도합니다 . 마이그레이션 중이기 때문에 모든 모듈에 주석을 달지 않았으므로 다음 플래그를 사용하여 이 오류를 비활성화할 수 있습니다.@InstallInAggregatedModule@ModuleHilt@Install@InstallIn

-Adagger.hilt.disableModulesHaveInstallInCheck=true.

아래와 같이 앱 수준에서 지정할 수 build.gradle있지만 모든 마이그레이션이 완료되면 이 플래그를 제거해야 합니다.

defaultConfig {
   
    //TODO: remove this after migration to Hilt
    javaCompileOptions {
        annotationProcessorOptions {
            arguments["dagger.hilt.disableModulesHaveInstallInCheck"]="true"
        }
    }
}

애플리케이션 클래스 마이그레이션

애플리케이션에 Hilt를 추가하기 위해 클래스 Application@HiltAndroidApp. 위에서 언급한 바와 같이 수업 에 있었던 @Component과를 제거해야 합니다 .@Component.BuilderAppComponent

Application확장하거나 DaggerApplication구현하는 경우 HasAndroidInjector두 경우 모두 아래에 표시된 대로 일부 코드를 유지해야 합니다. 이는 전체 마이그레이션이 완료될 때까지 둘 다 지원 Dagger하고 병렬로 수행하는 것입니다.Hilt

응용 프로그램 클래스 Application에서 확장 하면 다음과 같이 표시됩니다.DaggerApplication

Application구현하는 경우 HasAndroidInjector애플리케이션은 다음과 같아야 합니다.

Application전체 마이그레이션이 완료되면 클래스 에서 해당 코드를 제거해야 하며 Application아래와 같이 표시됩니다. (그러나 그것은 마지막 단계 중 하나일 것입니다. 지금 하지 마십시오.)

프로젝트를 실행하면 프로젝트가 성공적으로 빌드되고 앱이 런타임 예외 없이 실행되어야 합니다.

활동 클래스 마이그레이션

Dagger는 @ContributesAndroidInjectorAndroid Injector에 MainActivityModule포함된 모듈 중 하나인AggregatedModule

MainActivityModule마이그레이션 전의 모습

MainActivity마이그레이션 전의 모습

MainActivity로 마이그레이션하기 위해 모듈 클래스를 Hilt완전히 제거 하고 에 대한 주석을 추가합니다 . 우리도 확장 중이므로 해당 활동을 확장해야 하므로 마이그레이션 후 아래와 같은 모습이 됩니다.MainActivityModule@AndroidEntryPointMainActivityMainActivityDaggerAppCompatActivityAppCompatActivityMainActivity

프로젝트를 MainActivity로 마이그레이션하면 성공해야 합니다.Hilt

Fragment/View/BroadcastReceiver 마이그레이션

Fragment를 로 마이그레이션하는 작업은 Hilt로 Hilt마이그레이션할 때와 동일한 단계로 수행됩니다 MainActivity. 단계는 다음과 같습니다.

  1. @ContributesAndroidInjector모듈일 가능성이 있는 Fragment에 주석을 추가하는 코드를 제거하십시오.
  2. 조각을 SingletonComponent처리하던 모듈을 제거하십시오.@ContributesAndroidInjector
  3. Fragment에 다음과 같이 주석을 추가하십시오.@AndroidEntryPoint
  4. 프래그먼트가 확장된 경우 클래스 DaggerFragment에서 프래그먼트를 확장해야 합니다.Fragment

ViewModel 마이그레이션

ViewModel을 마이그레이션하려면 몇 가지 단계가 필요합니다.

먼저 viewModel에 다음과 같이 주석을 답니다.@HiltViewModel

FeatureViewModel인젝션을 받기 위해 아래와 같이 해당 파일에 추가할 프래그먼트 확장 종속성에서 제공되는 Hilt프래그먼트 확장을 사용합니다.viewModels()build.gradle

implementation "androidx.fragment:fragment-ktx:1.5.6"

이제 Dagger에 사용한 해당 바인딩 @Bind및 바인딩을 @IntoMap제거 합니다.@ViewModelKeyFeatureViewModel

Dagger에서 ViewModel을 주입하려면 더 이상 필요하지 않은 일부를 사용하여 런타임에 있을 속성도 있으므로 Dagger 에 다른 ViewModel/Fragment가 아직 없는 경우 관련 코드를 삭제할 수 lateinit var있습니다 .injectedViewModelFactoryViewModelModuleViewModelProviderFactory

프로젝트를 Fragment and ViewModel로 마이그레이션하면 성공해야 합니다.Hilt

다른 모듈을 마이그레이션합니다.

지금까지 우리는 마이그레이션하고 있었습니다 Components// Modules// 앱 모듈에서 Activity. Fragment하지만 지금 다른 모듈을 마이그레이션해야 합니다. 한 번에 하나의 모듈로 이동하고 다음 단계를 사용하여 Hilt로 완전히 마이그레이션합니다.

  1. 모듈의 파일 Hilt에 종속성 추가build.gradle
  2. @Module주석 으로 각각 주석을 답니다 @InstallIn.
  3. 더 이상 필요하지 않기 때문에 가지고 있는 경우 @JvmStatic각 주석에 대한 주석을 제거하십시오 .@ProvideHilt
  4. Fragment/ 에 주석을 Activity달고 @AndroidEntryPoint해당 항목을 제거하십시오.@ContributesAndroidInjector
  5. 주석이 달린 ViewModel을 마이그레이션 @HiltViewModel하고 프래그먼트 확장을 사용하여 viewModels()해당 뷰 모델을 주입합니다.
  6. 에서 더 이상 필요하지 않은 모든 모듈을 계속 제거하십시오 AggregatedModule. AggregatedModule 우리는 첫 번째 단계에서 위에서 만들었습니다.

각 프로젝트 모듈이 Hilt. 정리 시간 필요

  1. disableModuleInstallInCheck = true를 제거하고 앱 수준 또는 다른 항목에서 시작 부분에 추가 build.gradle하고 @DisableInstallInCheck주석이 추가된 경우 주석을 제거합니다.@Module
  2. defaultConfig {
       
        //TODO: remove this after migration to Hilt
        javaCompileOptions {
            annotationProcessorOptions {
                arguments["dagger.hilt.disableModulesHaveInstallInCheck"]="true"
            }
        }
    }
    

4. Dagger모든 모듈에서 모든 종속성을 제거합니다.

프로젝트 실행 Hilt 로 완전히 마이그레이션된 프로젝트를 성공적으로 실행해야 합니다.

요약 및 시사점

마이그레이션 후 코드 변경에 대한 높은 수준의 개요는 다음과 같습니다.

  1. 모든 코드 주석이 @Component// // 제거되었을 것 입니다 @Component.Builder.@Component.Factory@ContributesAndroidInjector@ViewModelKey
  2. 모든 ViewModel에 주석을 달아야 합니다.@HiltViewModel
  3. 모든 클래스는 주석 @Module으로 주석을 달아야 합니다.@InstallIn
  4. Fragments/Activities/View/Service에 주석을 달아야 합니다.@AndroidEntryPoint
  5. 애플리케이션 클래스는 다음과 같이 주석을 달아야 합니다.@HiltAndroidApp
  6. AppComponent및 관련 코드를 제거해야 합니다.
  7. @JvmStaticHilt 모듈 내부의 주석은 더 이상 존재하지 않아야 합니다.
  • Hilt를 사용한 의존성 주입
  • Hilt 공식 문서로 마이그레이션

마음에 드셨다면 팔로우와 잊지 마세요 :)

— — — — — — — — — — — —

GitHub | 링크드인 | 트위터

레벨업 코딩

우리 커뮤니티의 일원이 되어 주셔서 감사합니다! 가기 전에:

  • 이야기에 박수치고 작가 팔로우
  • 레벨업 코딩 출판물 에서 더 많은 콘텐츠 보기
  • 무료 코딩 면접 과정 ⇒ 과정 보기
  • 팔로우: 트위터 | 링크드인 | 뉴스 레터