Hilt

deBaeloper08·2022년 11월 1일
0

Hilt란?

안드로이드 공식 문서에 보면 Hilt는 프로젝트에서 종속 항목 수동 삽입을 실행하는 상용구를 줄이는 Android용 종속 항목 삽입 라이브러리라고 적혀있다. 기존에 dagger라는 라이브러리가 있었지만 dagger에서는 안드로이드의 생명주기를 고려하는 의존성 주입은 없어서 따로 구현해야 했다.

어떻게 사용하나요?

우선 Hilt 같은 경우 초기 설정이 중요하다. 필자는 설정하면서 안드로이드판 Spring이 아닌가 생각이 들었다. Hilt는 에러를 자세하게 알려주지 않고 설정이 꽤나 복잡하다.

우선 Inject 하는 방법으로는

  • Feild Injection
  • Constructor Injection

이렇게 두 가지 방법이 있지만 이 글에서는 Constructor Injection 예시를 들어보고자 한다.

  1. project의 build.gradle 파일에 플러그인을 추가한다.
plugins {
	...
	id 'com.google.dagger.hilt.android' versiono '2.44' apply false
}

  1. app의 build.gradle 파일에 다음 종속 항목을 추가한다.
plugins {
  id 'kotlin-kapt'
  id 'com.google.dagger.hilt.android'
}

dependencies {
  implementation "com.google.dagger:hilt-android:2.44"
  kapt "com.google.dagger:hilt-compiler:2.44"
}

  1. Hilt는 자바 8 기능을 사용하기에 app의 build.gradle 파일에 다음을 추가한다.
android {
  ...
  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }
}

  1. Hilt를 사용하는 모든 앱은 @HiltAndroidApp으로 주석이 지정된 Application 클래스를 포함해야 한다.
@HiltAndroidApp
class ExampleApplication: Application() {
	...
}

그리고 Manifest에 application 쪽에

android:name=".ExampleApplication"

해당 코드를 작성하는 것을 까먹으면 안 된다!

  1. Hilt를 사용하는 곳에는 모두 @AndroidEntryPoint 주석을 추가해야 Android 클래스에 종속 항목을 제공할 수 있다.
@AndroidEntryPoint
class ExampleActivity : AppCompatActivity() { 
	... 
}

  1. 예시에서 사용할 ExampleRepository와 ExampleRepositoryImpl을 생성한다.
interface ExampleRepository {
    fun test()
}
class ExampleRepoImpl: ExampleRepository {
    override fun test() {
        Log.d("TAG", "test: This is test")
    }
}

  1. Inject를 할 수 있게 Module Object를 생성한다.
@Module
@InstallIn(SingletonComponent::class)
object ExampleModule {

    @Provides
    @Singleton
    fun provideExampleRepository(): ExampleRepository = ExampleRepoImpl()
}

ExampleRepository가 들어가는 곳에는 ExampleRepoImpl()을 넣어 의존성을 주입한다.

  1. ExampleUseCase라는 클래스를 만든다.
class ExampleUseCase @Inject constructor(private val repository: ExampleRepository){
    fun execute() {
        repository.test()
    }
}

여기서 @Inject를 통해 repository 자리에 ExampleRepoImpl()이 들어간다.

  1. 예시에서 사용할 ViewModel을 만든다.
@HiltViewModel
class ExampleViewModel @Inject constructor(private val exampleUseCase: ExampleUseCase) : ViewModel() {
    fun doTest() {
        exampleUseCase.execute()
    }
}

ViewModel에서는 @HiltViewModel 주석을 달아주어야 한다.

  1. MainActivity에서 ViewModel을 생성하여 함수를 호출한다.
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
    private val viewModel: ExampleViewModel by viewModels()

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

        viewModel.doTest()
    }
}

결과가 정상적으로 나오는 것을 확인할 수 있다.

profile
안녕하세요! 안드로이드 개발자입니다😊

0개의 댓글