안드로이드 Kotlin Hilt로 의존성 주입(DI) 사용하기 1편

의존성 주입

의존성 주입은(DI) 프로그래밍에 널리 사용되는 개념입니다. DI 원칙을 따르면 훌륭한 앱 아키텍쳐 토대를 만들 수 있으며 다음과 같은 이점이 있습니다.

  • 코드 재사용 가능
  • 리팩토링 편의성
  • 테스트 편의성

앱에서 Hilt 사용하기

Hilt는 Android에서 의존성 주입을 위한 Jetpack의 권장 라이브러리입니다. Hilt는 프로젝트의 모든 Android 클래스에 컨테이너를 제공하고 수명 주기를 자동으로 관리함으로써 애플리케이션에서 DI를 실행하는 표준 방법을 정의합니다.

Hilt는 인기 있는 DI 라이브러리 Dagger를 기반으로 빌드되었으며 앱에 적용하기 어렵다는 단점을 개선되어 비교적 쉽게 앱에 적용할 수 있습니다.


개발환경


프로젝트 생성


















Empty Activity 선택










Language를 Kotlin으로 선택
Minimum SDK API21 선택 후 Finish 클릭


레이아웃

액티비티와 프레그먼트를 이동하면서 주입되는 인스턴스가 싱클턴인지 확인합니다. 소스는 https://github.com/aispark/myhilt에서 확인하세요.


의존성 추가


buildscript {
...
dependencies {
...
classpath 'com.google.dagger:hilt-android-gradle-plugin:2.28-alpha'
}
}

프로젝트의 루트 build.gradle 파일에 추가합니다.


plugins {
...
id 'kotlin-kapt'
id 'dagger.hilt.android.plugin'
}


dependencies {

...

//navgation 의존성 추가
implementation 'androidx.navigation:navigation-fragment-ktx:2.3.2'
implementation 'androidx.navigation:navigation-ui-ktx:2.3.2'

//hilt
implementation "com.google.dagger:hilt-android:2.28-alpha"
kapt "com.google.dagger:hilt-android-compiler:2.28-alpha"
}

app/build.gradle 파일에 추가합니다.



android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
}

Hilt는 자바 1.8 기능을 사용합니다. 프로젝트에서 자바 1.8을 사용 설정하려면 app/build.gradle 파일에 추가합니다.


Hilt 애플리케이션 클래스

Hilt를 사용하는 모든 앱은 @HiltAndroidApp 애노테이션이 지정된 Application 클래스를 포함해야 합니다.


@HiltAndroidApp
class HiltApp: Application() {
}

생성된 이 Hilt 구성요소는 Application 객체의 life cycle에 연결되며 이와 관련한 의존성 항목을 제공합니다. Application은 상위 구성요소이므로 다른 구성요소는 이 상위 구성요소에서 제공하는 종속 항목에 액세스할 수 있습니다.



<application
...
android:name=".HiltApp"
...
</application>

AndroidManifest.xml 파일에 내용을 추가합니다.


Hilt 바인딩 정의

싱클턴으로 유지하고 싶은 클래스를 정의하고 Activity, Fragment에서 의존성을 주입받아 hashcode로 동일한 인스턴스 인지 확인 할 수 있습니다.


@Singleton
class SingletonClass @Inject constructor() {
}

@Singleton은 스코프를 나타내고 이는 Application 레벨에서 유지됩니다. 클래스의 생성자에서 @Inject 주석을 사용하여 클래스의 인스턴스를 제공하는 방법을 Hilt에 알려줍니다.


Android 클래스에 종속 항목 삽입


@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
@Inject
lateinit var singletonClass: SingletonClass

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

Log.d("singleton", singletonClass.hashCode().toString())
}
}

의존성 주입을 받고자 하는 클래스는 @AndroidEntryPoint로 지정되어야 합니다. @Inject로 Singleton 인스턴스를 주입받고 onCreate 에서 hashcode를 출력해 봅니다.





의존성을 주입받은 모든 클래스에서 동일한 hashcode값을 얻을 수 있으며 이를 통해 Application 레벨에서 Singleton 인스턴스를 주입받아 사용할 수 있습니다.


Hilt 모듈

생성자 삽입할 수 없는 상황(외부 라이브러리, 인터페이스일 경우)에서는 Hilt 모듈을 사용하여 Hilt에 바인딩 정보를 제공할 수 있습니다. 이는 2편에서 다루도록 하겠습니다.



안드로이드 Kotlin Hilt로 의존성 주입(DI) 사용하기 2편

댓글