안드로이드에서 많이 사용하는 DI 라이브러리인 Hilt에서 보이는 Provider<T>
와 Lazy<T>
의 차이점!
우선 위 두 개는 모두 의존성 객체를 지연 초기화(lazy initialization)하는 방법으로, 필요할 때만 생성하도록 도와준다.
코틀린에서 by lazy
키워드 같이 실제 사용 시 객체를 초기화 하여 주입 시켜주는 방법이다.
Provider<T>
Provider<T>
는 호출할 때마다 새로운 객체를 생성한다. 즉, 여러 번 호출할 경우 매번 다른 인스턴스를 얻는다.
이 방법은 매번 새로운 객체가 필요한 경우 유용하다.
class MyClass @Inject constructor(
private val dependencyProvider: Provider<MyDependency>
) {
fun useDependency() {
val dependency = dependencyProvider.get() // 매 호출마다 새 인스턴스 반환
}
}
Lazy<T>
Lazy<T>
는 객체를 한 번만 생성하고, 이후에는 이미 생성된 인스턴스를 재사용하도록 한다.
Hilt에서 Lazy를 사용하려면 @Inject된 필드나 생성자에서 Lazy로 감싸면 된다.
class MyClass @Inject constructor(
private val lazyDependency: Lazy<MyDependency>
) {
fun useDependency() {
val dependency = lazyDependency.get() // 첫 번째 호출 시에만 생성
}
}