#Hilt Android Developer 공식 문서
=>https://developer.android.com/training/dependency-injection/hilt-android?hl=ko
#Hilt 공식문서
=>https://dagger.dev/hilt/application
plugins {
id("com.google.dagger.hilt.android") version "2.44" apply false
}
-Hilt Gradle Plugin을 적용하는 이유는 바이트 코드 변조를 수행해서 개발자들에게 편의성을 제공하기 위함이다. 따라서 프로그램의 최상단인 project에 build.gradle에 Hilt Plugin 의존성을 추가하고 개별 모듈에도 플러그인을 적용한다.
plugins{
kotlin("kapt")
id("com.google.dagger.hilt.android")
}
dependencies {
implementation("com.google.dagger:hilt-android:${Version.HILTANDROID}")
implementation("com.google.dagger:hilt-android-compiler:${Version.HILTANDROIDCOMPILER}")
kapt("com.google.dagger:hilt-android-compiler:vesion")
}
kapt {
correctErrorTypes = true
}
-어노테이션은 자바단에 포함되어 있지만 코틀린단에는 포함되어 있지 않다. 따라서 자바 어노테이션을 참고해서 코틀린 코드를 작성하게 되는데 이때 컴파일러는 이런 부분을 이해 할 수 없기 때문에 "kapt("com.google.dagger:hilt-android-compiler:vesion")"를 넣어준것이다.
-Hilt는 Java와 어노테이션 프로세스를 기반으로 작성된 라이브러리이기 때문에 코틀린에서 HiltAnnotation을 참조해서 코드를 작성하는 경우에는 컴파일 과정에서 kapt가 Stub이라는 자바 파일을 만들어서 자바 컴파일러가 Stub을 해석 할 수 있기 때문에 코틀린으로 작성한 코드도 해석 할 수 있다. 결국에는 HiltAnnotation을 사용 할 수 있는 것이다.
-kapt는 모르는 타입은 존재하지 않는 타입으로 대체해서 처리하는데 , HiltAnnotation 프로세서가 만약 처리하지 못한것이 있다면, 컴파일이 중단될 수 있기 때문에 kapt {correctErrorTypes = true} 로 설정해서 , Stub에서 오류가 발생한 타입을 추론을 해서 컴파일을 계속해서 진행 할 수 있게 도와준다.
-Hilt는 항상 @HiltAndroidApp 어노테이션을 찾아서 여기서 부터 Hilt가 출발한다.
-@HiltAndroidApp을 Application 클래스에 마킹해야 한다. 이렇게 한 후 빌드를 진행하면 Hilt가 앱의 생명주기와 연결된 SingletonComponent가 자동으로 생성한다. 이때 해당 컴포넌트는 앱의 전반에 걸쳐 싱글톤으로 유지되는 의존성을 관리하게 된다. 그리고 생성된 SingletonComponent는 "앱의 생명주기에 맞춰서 싱글톤으로 관리되며 바인딩 된 의존성을 담고 있는 컨테이너"라고 생각하면 된다.
-여러가지 어노테이션을 활용해서 이 SingletonComponent에 의존성을 추가 할 수 있는데 이것을 바인딩이라고 부른다. 추후에 특정 컴포넌트가 SingletonComponent에 바인딩 된 의존성을 요청할 수 있다.
-반드시 @HiltAndroidApp 마킹 이후에 컴포넌트에 마킹하면 된다.
-@AndroidEntryPoint를 컴포넌트에 작성하면 Hilt가 해당 컴포넌트에 알맞는 의존성 주입 컨테이너를 생성해서 개발자가 직접 의존성을 주입하지 않아도 된다. 또한 상위 컴포넌트에 @AndroidEntryPoint가 적용되어 있으면 하위 컴포넌트들도 상위 컴포넌트의 의존성에 접근 할 수 있다.
-즉, @AndroidEntryPoint는 의존성 주입을 위한 준비과정을 자동화 시켜준다.
-Inject는 두가지의 의미를 가지고 있다.
-클래스가 필요로 하는 의존성을 클래스의 필드에 직접 주입한느 방식이다.
-lateinit 키워드와 함께 사용되며 lateinit 키워드 위에 @Inject를 마킹하면 해당 객체에 대한 의존성을 자동으로 주입 받을 수 있다.
-클래스의 생성자에 @Inject를 마킹하면 해당 클래스가 의존성을 주입 받을 수 있음을 의미한다. 만약 A가 B를 의존한다면 A의 생성자에 @Inject를 마킹하면 A의 인스턴스가 생성될 때 B의 인스턴스가 자동으로 A에 주입되면서 A에서 B를 사용 할 수 있게 해준다. (A->B)
-@Module 어노테이션을 마킹하면 의존성을 제공하는 녀석을 포함할 수 있게 된다.
-즉, @Module이 마킹된 클래스의 내부에는 의존성 주입 어노테이션을 사용해서 의존성을 제공하는 메서드를 정의 할 수 있게 허락해준다.
-의존성을 제공하는 방법을 Hilt에게 알려준다.
-Hilt 모듈이 Hilt의 어떠한 생명주기에 결합하게 할 것인지를 지정해준다. 간단히 말해서 @InstallIn은 해당 Hilt 모듈이 어디에서 사용 될 것이지 또는 생명주기를 지정해주는 것을한다.
-즉, 어떤 컴포넌트에 Install 할 것인지를 정해줘야 한다는 것이다. 이때 생명주기는 컴포넌트의 생명주기를 따라간다.
-특정 타입의 객체 인스턴스를 생성하고 의존성을 주입할 때 사용되는 어노테이션이다.
-주로 외부 라이브러리 클래스 또는 생성 로직이 있는 객체(빌더패턴)들에 대한 의존성을 제공할 때 사용되는 어노테이션이다.
-@Provides 어노테이션이 붙은 메서드 내부에서 직접 객체를 생성하고 초기화 한 후 반환한다.
-추상 메서드에서 사용되며 인터페이스 타입에 대한 의존성을 주입하고자 할 때 사용한다.