Dagger Hilt Assisted Inject— 런타임 주입하기

GodDB
3 min readSep 26, 2021

--

chico明 — Free License Image

Hilt 2.31 버전 이후로, AssistedInject란 기능이 새로 생겼습니다.

기존 Hilt를 사용했을 땐, 미리 명시된 의존 Graph에서 명시적으로 정의된 Module만을 주입 받을 수 있었는데, AssistedInject 기능을 통해

기존 Dagger2처럼 런타임에도 Object 주입이 가능하게 되었습니다.

  1. @AssistedFactory 어노테이션을 통해 AssistedFactory를 정의해주고, 그 안에서 parameter로 우리가 동적으로 전달할 객체를 명시해줍니다.
  2. 그리고 Line 12 ~20에 명시된 것 처럼, ViewModelProvider를 정의해주고 그 내부에서 parameter로 1번에서 정의한 AssistedFactory와 전달하고자 하는 객체를 전달해줘, ViewModelProvider내부에서 AssistedFactory 객체를 호출하는 형태로 구현합니다.

여기까진 기존 Dagger2의 방법과 유사한데요. 주의할 점은 AssistedInject 기능을 사용하려면 기존 ViewModel 상단에 정의한 @HiltViewModel을 정의하면 안되며,

기존 @Inject 어노테이션이 아닌, @AssistedInject 어노테이션을 Constructor에 달아줘야 합니다.

그리고 기존 Graph Module이 아닌, AssistedFactory를 통해 객체 주입 받는다는 것을 명시하기 위해 AssistedFactory를 통해 주입받는 객체에 @Assisted 를 달아줍니다.

이렇게 해줌으로써, 위 코드에 정의된 movieListUsecase, movieDetailUseCase는 미리 정의한 Graph의 모듈을 통해 주입받으며, @Assisted어노테이션이 달린 contextWrapper는 AssistedFactory를 통해 주입받습니다.

다음은Activity에서, 앞서 정의한 AssistedFactoryViewModelProvider를 사용하여, ViewModel을 생성하는 방법입니다.

3. Activity/Fragment에서, 앞서 ViewModel에서 정의한 AssistedFactory를 주입받고 (@AssistedFactory 어노테이션이 달려 있으면 주입가능)

4. viewModels 라는 ViewModel 생성 Delegator를 통해 앞서 정의한ViewModelProvider를 호출해줌으로써, 동적으로 Activity/Fragment가 Hilt를 이용해 ViewModel에게 특정 Object를 주입해줄 수 있습니다.

AssistedInject를 통해 Module Inject에서 처리할 수 없는 Activity/Fragment의 Context를 지닌 작업들을 처리할 수 있습니다. (ex — Dialog)

Dialog Wrapping Object를 생성하여 ViewModel에게 전달해주면 ViewModel은 그 Wrapping 객체와 Interaction하여 Positive/Negative 클릭에 대한 처리도 모두 ViewModel 안에서 이뤄지게 할 수 있습니다.

기타 이외에도 동적으로 ViewModel에게 전달해줘야 할 Object가 있다면, Setter를 이용하는 것이 아닌 AssistedInject를 사용해보시길 권장 드립니다.

--

--