[안드로이드스튜디오_문화][Hilt 설정하는 방법]

기말 지하기포·2024년 1월 13일
1

#Hilt Android Developer 공식 문서
=>https://developer.android.com/training/dependency-injection/hilt-android?hl=ko

#Hilt 공식문서
=>https://dagger.dev/hilt/application

의존성 추가하기

프로젝트 수준의 build.gradle에 의존성 추가하기

plugins {
	id("com.google.dagger.hilt.android") version "2.44" apply false
}

-Hilt Gradle Plugin을 적용하는 이유는 바이트 코드 변조를 수행해서 개발자들에게 편의성을 제공하기 위함이다. 따라서 프로그램의 최상단인 project에 build.gradle에 Hilt Plugin 의존성을 추가하고 개별 모듈에도 플러그인을 적용한다.

모듈수준의 build.gradle에 의존성 추가하기

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에서 오류가 발생한 타입을 추론을 해서 컴파일을 계속해서 진행 할 수 있게 도와준다.

@HiltAndroidApp

-Hilt는 항상 @HiltAndroidApp 어노테이션을 찾아서 여기서 부터 Hilt가 출발한다.

-@HiltAndroidApp을 Application 클래스에 마킹해야 한다. 이렇게 한 후 빌드를 진행하면 Hilt가 앱의 생명주기와 연결된 SingletonComponent가 자동으로 생성한다. 이때 해당 컴포넌트는 앱의 전반에 걸쳐 싱글톤으로 유지되는 의존성을 관리하게 된다. 그리고 생성된 SingletonComponent는 "앱의 생명주기에 맞춰서 싱글톤으로 관리되며 바인딩 된 의존성을 담고 있는 컨테이너"라고 생각하면 된다.

-여러가지 어노테이션을 활용해서 이 SingletonComponent에 의존성을 추가 할 수 있는데 이것을 바인딩이라고 부른다. 추후에 특정 컴포넌트가 SingletonComponent에 바인딩 된 의존성을 요청할 수 있다.

@AndroidEntryPoint

-반드시 @HiltAndroidApp 마킹 이후에 컴포넌트에 마킹하면 된다.

-@AndroidEntryPoint를 컴포넌트에 작성하면 Hilt가 해당 컴포넌트에 알맞는 의존성 주입 컨테이너를 생성해서 개발자가 직접 의존성을 주입하지 않아도 된다. 또한 상위 컴포넌트에 @AndroidEntryPoint가 적용되어 있으면 하위 컴포넌트들도 상위 컴포넌트의 의존성에 접근 할 수 있다.

-즉, @AndroidEntryPoint는 의존성 주입을 위한 준비과정을 자동화 시켜준다.

@Inject

-Inject는 두가지의 의미를 가지고 있다.

필드 주입 시 사용되는 @Inject

-클래스가 필요로 하는 의존성을 클래스의 필드에 직접 주입한느 방식이다.

-lateinit 키워드와 함께 사용되며 lateinit 키워드 위에 @Inject를 마킹하면 해당 객체에 대한 의존성을 자동으로 주입 받을 수 있다.

생성자 주입 시 사용되는 @Inject

-클래스의 생성자에 @Inject를 마킹하면 해당 클래스가 의존성을 주입 받을 수 있음을 의미한다. 만약 A가 B를 의존한다면 A의 생성자에 @Inject를 마킹하면 A의 인스턴스가 생성될 때 B의 인스턴스가 자동으로 A에 주입되면서 A에서 B를 사용 할 수 있게 해준다. (A->B)

@Module

-@Module 어노테이션을 마킹하면 의존성을 제공하는 녀석을 포함할 수 있게 된다.

-즉, @Module이 마킹된 클래스의 내부에는 의존성 주입 어노테이션을 사용해서 의존성을 제공하는 메서드를 정의 할 수 있게 허락해준다.

-의존성을 제공하는 방법을 Hilt에게 알려준다.

@InstallIn

-Hilt 모듈이 Hilt의 어떠한 생명주기에 결합하게 할 것인지를 지정해준다. 간단히 말해서 @InstallIn은 해당 Hilt 모듈이 어디에서 사용 될 것이지 또는 생명주기를 지정해주는 것을한다.

-즉, 어떤 컴포넌트에 Install 할 것인지를 정해줘야 한다는 것이다. 이때 생명주기는 컴포넌트의 생명주기를 따라간다.

@Provides

-특정 타입의 객체 인스턴스를 생성하고 의존성을 주입할 때 사용되는 어노테이션이다.

-주로 외부 라이브러리 클래스 또는 생성 로직이 있는 객체(빌더패턴)들에 대한 의존성을 제공할 때 사용되는 어노테이션이다.

-@Provides 어노테이션이 붙은 메서드 내부에서 직접 객체를 생성하고 초기화 한 후 반환한다.

@Binds

-추상 메서드에서 사용되며 인터페이스 타입에 대한 의존성을 주입하고자 할 때 사용한다.

profile
포기하지 말기

0개의 댓글