[Hilt/Kotlin] 안드로이드 Hilt 무작정 써보기

Android · 2020. 7. 10. 23:37

Hilt

이전 포스팅에서는 Dagger2를 무작정 따라 써 보는 방법에 대해 알려드렸습니다.

 

이번엔 엄청난 Hilt(이하 힐트)를 무작정 따라 써 볼 수 있게 해드리겠습니다.

 

이 예제 역시 간단하게 파일 목록 조회와, 해당 파일명의 랜덤 아이디를 부여하는걸로 작성되었습니다.

 

우선 gradle 설정이 필요합니다.

 

[프로젝트 단위]

classpath 'com.google.dagger:hilt-android-gradle-plugin:2.28-alpha'

 

[앱 단위]

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

...

dependencies {
    ...

    implementation 'com.google.dagger:hilt-android:2.28-alpha'
    kapt 'com.google.dagger:hilt-android-compiler:2.28-alpha'

    ...
}

 

 

이제 gradle 설정은 끝났습니다.

 

이후 모델과 모듈 설정이 필요합니다.

 

모델과 모듈 설정은 이전 포스팅과 동일합니다.

 

[모델]

data class FileDataModel (var data: String)

 

[모듈]

@Module
@InstallIn(ApplicationComponent::class)
class FileModule {

    @Provides
    @Named("name")
    fun provideFileName(): ArrayList<FileDataModel> {
        val array = ArrayList<FileDataModel>()
        val files = File("/sdcard").list().map {
            val file = File(it)
            array.add(FileDataModel(file.name))
        }
        return array
    }

    @Provides
    @Named("random")
    fun provideRandom(): ArrayList<FileDataModel> {
        val array = ArrayList<FileDataModel>()
        val files = File("/sdcard").list().map {
            val file = File(it)
            array.add(FileDataModel(Random.nextInt(0, 10000).toString()))
        }
        return array
    }
}

이 때 @InstallIn 이라는 새로운 어노테이션이 생겼습니다.

 

이 어노테이션에 쓰인 값은 힐트에서 지원하는 클레스 입니다.

 

이 어노테이션을 작성하여, 힐트가 사용할 모듈을 정의합니다.

 

힐트는 Dagger2(이하 대거)와는 달리 컴포너트를 따로 만들어 줄 필요가 없습니다. (!)

 

이제 모델과 모듈 설정은 끝났습니다.

 

 

이제 Application을 상속하는 새로운 클레스를 만들어야 합니다.

@HiltAndroidApp
class MyApplication : Application() {}

매우 간단하게 이렇게 만들어주면 됩니다.

 

 

마지막으로 Manifest 설정이 필요합니다.

<application
        ...
        android:name=".activity.MyApplication"
        ... />

android:name="Application 상속 클래스 위치"

 

이거까지 추가해주면 힐트를 사용하기 위한 모든 준비가 끝났습니다!

 

 

이제 힐트를 써봅시다.

@AndroidEntryPoint
class MainActivity : AppCompatActivity(R.layout.activity_main) {

    @Inject
    @Named("name")
    lateinit var fileData: ArrayList<FileDataModel>

    @Inject
    @Named("random")
    lateinit var fileData2: ArrayList<FileDataModel>

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

        for(i in 0 until fileData.size){
            Log.d(fileData[i].data, fileData2[i].data)
        }
    }
}

@AndroidEntryPoint 어노테이션을 사용하여, 힐트를 통한 의존성 주입이 사용된다고 정의합니다.

 

그리고 힐트는 대거와는 달리 Dagger~~~.inject(this) 메소드가 따로 필요하지 않습니다. (!!!!)

 

super.onCreate(~~~)가 호출될 때, 자동으로 의존성 주입이 시작됩니다. (!!!!!!!!!!!!!!!)

 

위 소스의 결과는 다음과 같습니다.

 

해당 포스트에 쓰인 예제는 깃허브에 올려두었습니다.

'Android' 카테고리의 다른 글

[Dagger2/Kotlin] 안드로이드 Dagger2 무작정 써보기  (0) 2020.07.10
안드로이드 Context의 종류  (0) 2020.06.25