다중 모듈 앱의 Hilt

Hilt 코드를 생성하려면 Hilt를 사용하는 모든 Gradle 모듈에 액세스해야 합니다. Application 클래스를 컴파일하는 Gradle 모듈에는 전이 종속 항목에 모든 Hilt 모듈과 생성자 삽입 클래스가 있어야 합니다.

다중 모듈 프로젝트가 일반 Gradle 모듈로 구성되었다면 Hilt를 사용한 종속 항목 삽입에 설명된 대로 Hilt를 사용할 수 있습니다. 그러나 동적 기능 모듈(DFM)이 포함된 앱에서는 그렇지 않습니다.

동적 기능 모듈의 Hilt

DFM에서는 일반적으로 모듈이 서로 종속되는 방식이 반전됩니다. 따라서 Hilt는 동적 기능 모듈에서 주석을 처리할 수 없습니다. DFM에서 종속 항목 삽입을 실행하려면 Dagger를 사용해야 합니다.

DFM과 관련하여 이 문제점을 해결하려면 구성요소 종속 항목을 사용해야 합니다. 다음 단계를 따르세요.

  1. DFM에 필요한 종속 항목이 있는 app 모듈(또는 Hilt가 처리할 수 있는 다른 모듈)에서 @EntryPoint 인터페이스를 선언합니다.
  2. @EntryPoint 인터페이스에 종속된 Dagger 구성요소를 만듭니다.
  3. DFM에서 평소와 같이 Dagger를 사용합니다.

Hilt를 사용한 종속 항목 삽입 페이지의 예를 생각해 보세요. login 동적 기능 모듈을 프로젝트에 추가한다고 가정해 보겠습니다. LoginActivity라는 활동으로 로그인 기능을 구현합니다. 즉, 애플리케이션 구성요소에서만 결합을 가져올 수 있습니다.

이 기능을 사용하려면 authInterceptor 결합이 있는 OkHttpClient가 필요합니다.

먼저 다음과 같이 login 모듈에 필요한 결합이 있는 ApplicationComponent에 설치된 @EntryPoint 인터페이스를 만듭니다.

Kotlin

// LoginModuleDependencies.kt - File in the app module.

@EntryPoint
@InstallIn(ApplicationComponent::class)
interface LoginModuleDependencies {

  @AuthInterceptorOkHttpClient
  fun okHttpClient(): OkHttpClient
}

자바

// LoginModuleDependencies.java - File in the app module.

@EntryPoint
@InstallIn(ApplicationComponent.class)
public interface LoginModuleDependencies {

  @AuthInterceptorOkHttpClient
  OkHttpClient okHttpClient();
}

LoginActivity에서 필드 삽입을 실행하려면 다음과 같이 @EntryPoint 인터페이스에 종속된 Dagger 구성요소를 만듭니다.

Kotlin

// LoginComponent.kt - File in the login module.

@Component(dependencies = [LoginModuleDependencies::class])
interface LoginComponent {

  fun inject(activity: LoginActivity)

  @Component.Builder
  interface Builder {
    fun context(@BindsInstance context: Context): Builder
    fun appDependencies(loginModuleDependencies: LoginModuleDependencies): Builder
    fun build(): LoginComponent
  }
}

자바

// LoginComponent.java - File in the login module.

@Component(dependencies = LoginModuleDependencies.class)
public interface LoginComponent {

  void inject(LoginActivity loginActivity);

  @Component.Builder
  interface Builder {
    Builder context(@BindsInstance Context context);
    Builder appDependencies(LoginModuleDependencies loginModuleDependencies);
    LoginComponent build();
  }
}

이러한 단계가 완료되면 DFM에서 평소와 같이 Dagger를 사용합니다. 예를 들어 다음과 같이 ApplicationComponent의 결합을 클래스의 종속 항목으로 사용할 수 있습니다.

Kotlin

// LoginAnalyticsAdapter.kt - File in the login module.

class LoginAnalyticsAdapter @Inject constructor(
  @AuthInterceptorOkHttpClient okHttpClient: OkHttpClient
) { ... }

자바

// LoginAnalyticsAdapter.java - File in the login module.

public class LoginAnalyticsAdapter {

  private final OkHttpClient okHttpClient;

  @Inject
  LoginAnalyticsAdapter(
    @AuthInterceptorOkHttpClient OkHttpClient okHttpClient
  ) {
    this.okHttpClient = okHttpClient;
  }
  ...
}

필드 삽입을 실행하려면 다음과 같이 applicationContext를 사용하여 ApplicationComponent 종속 항목을 가져오는 Dagger 구성요소의 인스턴스를 만듭니다.

Kotlin

// LoginActivity.kt - File in the login module.

class LoginActivity : AppCompatActivity() {

  @Inject
  lateinit var loginAnalyticsAdapter: LoginAnalyticsAdapter

  override fun onCreate(savedInstanceState: Bundle?) {
    DaggerLoginComponent.builder()
        .context(this)
        .appDependencies(
          EntryPointsAccessors.fromApplication(
            applicationContext,
            LoginModuleDependencies::class.java
          )
        )
        .build()
        .inject(this)

    super.onCreate(savedInstanceState)
    ...
  }
}

자바

// LoginActivity.java - File in the login module.

public class LoginActivity extends AppCompatActivity {

  @Inject
  LoginAnalyticsAdapter loginAnalyticsAdapter;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    DaggerLoginComponent.builder()
        .context(this)
        .appDependencies(
          EntryPointsAccessors.fromApplication(
            getApplicationContext(),
            LoginModuleDependencies.class
          )
        )
        .build()
        .inject(this);

    super.onCreate(savedInstanceState);
    ...
  }
}

동적 기능 모듈의 모듈 종속 항목에 관한 자세한 내용은 동적 기능 모듈을 사용한 구성요소 종속 항목을 참조하세요.

Android의 Dagger에 관한 자세한 내용은 Android 앱에서 Dagger 사용을 참조하세요.