티스토리 뷰
작동 방식

Hilt
Hilt는 컴파일 타임에 KAPT/KSP를 통해 어노테이션을 분석한다.

Metro
Metro는 코틀린 플러그인 컴파일러 시점의 FIR 단계에서 어노테이션을 분석한다.

FIR 단계는 IDE에서도 실행되기 때문에 실시간 오류 표시가 가능하고, 컴파일러가 내장되어 있기 때문에 별도의 추가 프로세서 호출이 필요 없어서 KAPT/KSP 보다 빠른 컴파일 속도를 제공한다. 하지만 Metro는 JAVA를 지원하지 않는다.
DI 그래프 정의
Hilt
@HiltAndroidApp 어노테이션을 사용해 Application class에서 전역 그래프를 생성하며, 애플리케이션 시작 시점에 전역 그래프를 생성한다. 애플리케이션이 초기화 되는 시점에 그래프가 생성되므로 제어권은 프레임워크가 갖는다.
@HiltAndroidApp
class ExampleApplication : Application() { ... }
Metro
createGraph<T>()가 호출되는 런타임 시점에 전역 그래프가 생성된다. createGraph<T>() 의 호출 시점에 그래프가 생성되기 때문에 개발자가 그래프의 생성 시점을 제어할 수 있다.
val graph = createGraph<AppGraph>()
class FestaBookApp : Application() {
val festaBookGraph: FestaBookAppGraph by lazy {
createGraphFactory<FestaBookAppGraph.Factory>().create(this)
}
그래프에 등록
| 등록 방법 | Metro | Hilt |
| 프로바이더 등록 | 그래프 내에 직접 @Provides 함수 생성 | 모듈 내에 @Provides 함수 생성 |
| 인터페이스 타입의 구현체 등록 | 클래스에 @ContributesBinding, @ContributesTo | 모듈 내에 @Binds 함수 생성 |
| 모듈 생성 | @BindingContainer와@ContributeTo 사용 | @Module과 @InstallIn 사용 |
| 구현체 타입 등록 | @Inject(클래스에), @Inject constructor | @Inject constructor |
DI 방법
Hilt와 Metro 모두 컴파일 시점에 DI 그래프 전체를 분석하고 필요한 의존성 코드를 준비한 후, 런타임에 준비된 코드를 빠르게 수행한다.
생성자 주입
Hilt
- @Inject constructor로 생성자 주입 (요청하는 곳이 반드시 Hilt Component에 연결되어 있어야한다.)
- @AssistedInject, @Assisted , @AssistedIFactory 사용하여 주입
Metro
- @Injcet constructor, @Inject(클래스에)로 생성자 주입
- @AssistedInject, @Assisted , @AssistedIFactory사용하여 주입
필드 주입
Hilt
- lateinit var 사용
Hilt는 FIR/IR 단계에 직접 동작하지 않기 때문에 private 필드에 접근이 불가하다.
- inject() 함수 필요 ❌
//java
EntryPointAccessors.fromActivity(this, ...).inject(this)
Hilt는 내부에서 @AndroidEntryPoint가 붙으면 위 자바 코드를 통해 자동 삽입하기 때문에 inject() 함수 호출이 필요 없다.
- MembersInjector 필요 ❌
MembersInjector 또한 Hilt가 자동으로 생성해주기 때문에 사용하지 않는다.
Metro
- lateinit var 사용
Metro는 FIR/IR 단계에 직접 동작하기 때문에 private 필드에 접근이 가능하다.
- 그래프의 inject()함수 호출
의존성 그래프에 inject()함수를 정의하고 명시적으로 호출
@DependencyGraph
interface AppGraph {
fun inject(target: ProfileActivity)
}
val graph = createGraph<AppGraph>()
graph.inject(profileActivity)
- MembersInjector 사용
MembersInjector 인스턴스를 통해 직접 주입
@Inject
class ProfileInjector(
private val injector: MembersInjector<ProfileActivity>
) {
fun performInjection(activity: ProfileActivity) {
injector.inject(activity)
}
}
'안드로이드' 카테고리의 다른 글
| LifeCycle Of View (0) | 2025.12.09 |
|---|---|
| Metro로 ViewModel 생성하기 (0) | 2025.11.06 |
| Lottie (0) | 2025.11.05 |
| LifeCycle Of ViewModel (1) | 2025.10.05 |
| Android Thread 통신과 Handler·Looper (4) | 2025.08.29 |