티스토리 뷰

작동 방식

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
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2026/01   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함