본문 바로가기
Development/Android

[Android] Dependency Injection (a.k.a DI) - 4. 기반코드를 Hilt로 리팩토링 해보자!

by du.it.ddu 2020. 10. 25.
반응형

자, 이번 포스팅에선 Hilt를 사용해보자.

developer.android.com/training/dependency-injection/hilt-android?hl=ko

 

Hilt를 사용한 종속 항목 삽입  |  Android 개발자  |  Android Developers

Hilt는 프로젝트에서 수동 종속 항목 삽입을 실행하는 상용구를 줄이는 Android용 종속 항목 삽입 라이브러리입니다. 수동 종속 항목 삽입을 실행하려면 모든 클래스와 종속 항목을 수동으로 구성

developer.android.com

Hilt에 대해선 위 문서를 참고 하는것을 추천한다.

현재까지 나온 버전은 alpha 이지만, 드로이드나이츠를 보니 많은 개발자분들이 벌써 Dagger, Koin에서 Hilt로 갈아타고 있는 것 같았다.

나 또한 사이드 프로젝트에선 Hilt를 적용해보고 있는 중이다.

이제 Hilt를 사용해 보자.


- Dependency 추가

 

// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
    ...
    
    dependencies {
        ...
        classpath 'com.google.dagger:hilt-android-gradle-plugin:2.28-alpha'
    }
}

allprojects {
    ...
}

task clean(type: Delete) {
    ...
}

프로젝트 레벨의 gradle의 dependencies에 위와 같이 추가한다.

...
apply plugin: 'kotlin-kapt'
apply plugin: 'dagger.hilt.android.plugin'

android {
    ...

    defaultConfig {
        ...
    }

    buildTypes {
        ...
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    
    kotlinOptions {
        jvmTarget = JavaVersion.VERSION_1_8
    }
}

dependencies {
    ...
    
    implementation "com.google.dagger:hilt-android:2.28-alpha"
    kapt "com.google.dagger:hilt-android-compiler:2.28-alpha"

    implementation 'androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha02'
    kapt 'androidx.hilt:hilt-compiler:1.0.0-alpha02'

    implementation "androidx.fragment:fragment-ktx:1.2.5"
}

앱 레벨의 gradle에 위와 같이 추가한다. plugin, compileOptions, dependencies 모두 추가해야 한다.


- 리팩토링

github.com/DuItDDu/Android-Codelabs/tree/master/Android-Dependency-Injection

 

DuItDDu/Android-Codelabs

Android Codelabs. Contribute to DuItDDu/Android-Codelabs development by creating an account on GitHub.

github.com

결과를 먼저 보고싶다면, 위 깃허브에서 androidhiltandroid_dependency_injection/hilt 브랜치를 체크아웃하면 된다.

koin으로 리팩토링 한 것과 거의 유사하다.

하지만 hilt를 반영한 것은 koin과 달리 Local/Remote 분리가 제외되었으니 참고 바란다.

(사실 이런 경우가 잘 없음..)

필요하다면 @Binds 에 대해서 알아보면 될 것이다.


- Hilt 모듈

// RepositoryModule
@Module
@InstallIn(ApplicationComponent::class)
object RepositoryModule {

    @Singleton
    @Provides
    fun provideRemoteRepository(dataSourceImpl: RemoteDataSourceImpl) =
        DataRepository(dataSourceImpl)
}
// DataSourceModule
@Module
@InstallIn(ApplicationComponent::class)
object DataSourceModule {
    @Provides
    fun provideRemoteDataSource() = RemoteDataSourceImpl()
}

Koin과 다르게 어노테이션을 사용하고 있다.

모듈은 object로 생성되며, @Module과 @InstallIn(...)이 필요하다. 이 모듈이 어떤 컴포넌트에서 동작하는지에 따라 @InstallIn에 다른 인자를 주어야 한다. 컴포넌트에 대해선 공식 문서를 참고 바란다.

그리고 객체를 생성하여 제공하는 함수엔 @Provides 어노테이션을 적용하며, 관례적으로 provide로 시작하는 함수명을 사용한다.

싱글턴 객체를 원하면 @Singleton 어노테이션을 추가해주면 된다.

Koin과는 달리 ViewModel을 위한 모듈은 없는데, 이는 구글이 제공해주는 KTX를 활용하기 때문에 생략되었다.


- MyApplication

@HiltAndroidApp
class MyApplication : Application() {
    override fun onCreate() {
        super.onCreate()

    }
}

@HiltAndroidApp 어노테이션을 적용해주는 것으로 끝이다.

그럼 어노테이션에 의해 자동 DI가 동작한다.


- MainActivity

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
    ...
    
    private val viewModel: MainViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        ...
    }
    
    ...

    private fun initViewModel() {
        viewModel.dataList.observe(this) {
            dataListAdapter.dataList = it
        }

        viewModel.loadDataList()
    }
}

KTX에서 제공하는 by viewModels()에 의해 viewModel이 주입된다. KTX를 만들어준 구글에게 경의를 표하자.


- MainViewModel

class MainViewModel @ViewModelInject constructor(
    private val repository: DataRepository
) : ViewModel() {
    ...
}

ViewModel은 @ViewModelInject 어노테이션을 적용하여 생성자를 정의해주면 된다.

개꿀..


Dagger를 사용 해 봤다면 Hilt가 굉장히 쉽게 바뀌었다고 느낄 수 있다. 다만 현재까지 편리성은 Koin이 더 좋은 것 같기도..

어노테이션을 통해 작업하다 보면 아무래도 파악이 쉽지는 않다. (나만 그런가?)

Hilt는 아직 정식 릴리즈 버전이 아니기 때문에 앞으로 어떻게 변경될지는 알 수 없다. 다만 정식 버전이 릴리즈되면 Hilt를 사용하는 것이 여러모로 좋지 않을까 하는 생각이 든다. KTX도 만들어서 배포 해 주니까..

구글이나 유튜브에 다양하고 좋은 자료들이 많으니 참고해서 Hilt를 사용해보는 것을 추천한다.

무엇보다 부족한 이 글을 읽고 DI에 대해 조금이나마 이해하고 적용할 수 있게 되었다면 좋겠다.

반응형