Hilt에서 Binding 하는 방법은 여러가지가 있지만 우선 앞에서 크게 2가지 방법으로 사용하는 것을 배웠다.

하나는 컴포넌트에 모듈을 생성하여 @Provide를 사용하여 바인딩 하는것이고 또 하나는 생성자에 @Inject를 사용하여 바인딩 하는것이다.

@Inject

Inject는 크게 3가지로 사용한다.

  1. 생성자 주입
  2. 필드 주입
  3. 메서드 주입

생성자 주입

class UserRepository @Inject constructor(
    private val remoteDataSource: RemoteDataSource,
    private val localDataSource: LocalDataSource
) {
    fun getUser(id: String): User {
        // 구현...
    }
}

일반적으로 많이 사용하고 권장하는 방식으로서 클래스 생성자 앞에 @Inject를 사용한다.

위 코드에서 constructor 앞에 Inject를 사용하게 되면은 RemoteDataSource,LocalDataSource 의존성을 hilt component에 요청하고 Runtime 때 주입을 받게 된다.

생성자 파라미터로 주입을 받기 때문에 UserRepository를 인스턴스화 할 때부터 생성자 의존성을 참조할 수 있어서 UserRepository가 생성되는 시점에 필요한 모든 의존성이 보장된다.

필드 주입

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {

    @Inject
    lateinit var analyticsTracker: AnalyticsTracker

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

        analyticsTracker.trackScreenView("MainActivity")
        //...
}

일반적으로 안드로이드 클래스(Activity, fragment 등등)에서는 생성자 주입이 힘들기 때문에 필드 주입을 활용한다.

Activity나 sevice 등 안드로이드 클래스들이 개발자가 직접 인스턴스화 하는 것이 아니고 특정 시점에 시스템이 인스턴스화 한다. 그래서 생성자 주입은 불가능 하고 필드 주입 또는 메서드 주입만 가능하다.