https://dagger.dev/hilt/optional-inject


7.2 Migration – Optional Injection

왜 선택적 주입이 필요한가?

Hilt를 사용하는 Fragment는 Hilt를 사용하는 Activity에 속해야 하고, Hilt를 사용하는 Activity는 Hilt를 사용하는 Application에 속해 있어야 한다. 이는 순수한 Hilt 코드베이스를 위해서는 자연스러운 제약조건이며, Hilt를 사용하지 않는 Fragment 또는 Activity를 가지고 있다면 마이그레이션 할때 문제가 될 수 있다. 예를 들면, Hilt로 프레그먼트를 마이그레이션 하길 원하지만 한번에 마이그레이션 하기에는 너무 많은 곳에서 사용되고 있을 수 있다. 선택적 주입(Optional Injection)없이는 Hilt를 사용하는 프레그먼트 사용하기 위해서는 해당 Fragment를 사용하는 모든 Activity를 먼저 마이그레이션 해야 한다. 그렇지 않으면, Fragment는 Fragment 자신에게 의존성을 주입하려고 할 때 Hilt 컴포넌트를 찾으려다가 크래쉬가 발생한다. 코드베이스 사이즈에 따라 이는 대공사가 될 수 있다.

@OptionalInject를 사용하는 방법

@AndroidEntryPoint를 사용하는 클래스와 함께 @OptionalInject 어노테이션을 추가하면 Hilt를 사용하는 상위 항목이 있을때만 주입을 시도 하게 된다. 이 어노테이션을 사용하는 것은 생성된 기본 클래스에서 주입 성공시 true를 반환하는 wasInjectedByHilt() 메서드를 생성하는데 영향을 끼친다.

Note : 기본 클래스에서 생성된 API는 gradle 플러그인 사용자가 액세스 할 수 없으므로, OptionalInjectCheck의 정적 헬퍼 메서드를 사용하여 이 기능에 액세스 할 수 있는 대체 API가 있다.

이를 통해 다른 방법으로 의존성을 제공 할 수 있다 (일반적으로 Hilt를 사용하기 전에 의존성을 얻는 방법과는 다르다).

예를 들면 다음과 같다.

@OptionalInject
@AndroidEntryPoint
class MyFragment : Fragment() {

    @Inject lateinit var foo: Foooverride fun onAttach(activity: Activity) {
        super.onAttach(activity)  // 주입은 여기서 발생한다. 하지만 Activity가 Hilt를 사용할 때만 발생한다.
        if (!wasInjectedByHilt()) {
            // 이전 방법으로 Dagger를 얻고 주입한다
        }
    }
}
카테고리: Dagger2

0개의 댓글

답글 남기기

Avatar placeholder

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.