Programming/Android

[이슈 기록] Android 에서 단일 모듈 -> 멀티 모듈로 변경할 때 만났던 빌드 에러 이슈

YK Choi 2022. 6. 27. 00:21

클린 아키텍쳐를 위하여

app - domain - data 의 Layer로 분리한다고 했을 때,

app은 domain의 의존성을 갖고(usecase or repository interface 등),

data는 domain의 의존성을 갖는다(repository interface를 상속해야함 등)

 

그런데 app 이 domain 의 의존성만 갖고 있으면 빌드 에러가 났었다.

(data의 di에서 Repository interface의 구현체인 RepositoryImp 을 주입해주는데, domain의 의존성만으로 repositoryImp을 알 수 없기 때문이라고 생각한다)

따라서 app 모듈에서 domain과 data 모듈에 모두 의존성을 추가하니 문제가 해결되었다.

 

--아무리 구글링해도 안나왔다. 한 4시간 정도 삽질했다--

 

에러문구는 아래와 같았다.

C:\Users\user\Desktop\androidWorkspace\KuringHouse\app\build\generated\source\kapt\debug\com\yeonkyu\kuringhouse\KuringHouseApplication_HiltComponents.java:140: error: [Dagger/MissingBinding] com.yeonkyu.domain.repository.LoginRepository cannot be provided without an @Provides-annotated method.
  public abstract static class SingletonC implements KuringHouseApplication_GeneratedInjector,
                         ^
      com.yeonkyu.domain.repository.LoginRepository is injected at
          com.yeonkyu.domain.usecase.auth.GetUserUseCase(repository)
      com.yeonkyu.domain.usecase.auth.GetUserUseCase is injected at
          com.yeonkyu.kuringhouse.presentation.login.LoginViewModel(getUserUseCase, ��)
      com.yeonkyu.kuringhouse.presentation.login.LoginViewModel is injected at
          com.yeonkyu.kuringhouse.presentation.login.LoginViewModel_HiltModules.BindsModule.binds(vm)
      @dagger.hilt.android.internal.lifecycle.HiltViewModelMap java.util.Map<java.lang.String,javax.inject.Provider<androidx.lifecycle.ViewModel>> is requested at
          dagger.hilt.android.internal.lifecycle.HiltViewModelFactory.ViewModelFactoriesEntryPoint.getHiltViewModelMap() [com.yeonkyu.kuringhouse.KuringHouseApplication_HiltComponents.SingletonC �� com.yeonkyu.kuringhouse.KuringHouseApplication_HiltComponents.ActivityRetainedC �� com.yeonkyu.kuringhouse.KuringHouseApplication_HiltComponents.ViewModelC]
  It is also requested at:
      com.yeonkyu.domain.usecase.auth.AuthorizeUseCase(repository)
      com.yeonkyu.domain.usecase.auth.UpdateUserUseCase(repository)C:\Users\user\Desktop\androidWorkspace\KuringHouse\app\build\generated\source\kapt\debug\com\yeonkyu\kuringhouse\KuringHouseApplication_HiltComponents.java:140: error: [Dagger/MissingBinding] com.yeonkyu.domain.repository.RoomRepository cannot be provided without an @Provides-annotated method.
  public abstract static class SingletonC implements KuringHouseApplication_GeneratedInjector,

 

그리고 Retrofit은 Data Layer 에만 있으면 될 것이라 생각했는데, app Layer 에서도 같이 의존성을 추가해야했다.

(이거는 다행히 에러로그가 비교적 친절하다 - 대충 Retrofit을 provide받을 수 없다는 에러 문구)