질문 정리

[Dagger/MissingBinding] UserData cannot be provided without an @Provides-annotated method.

five2week 2024. 7. 13. 08:06

문제 상황

Dagger에서 발생하는 MissingBinding 오류는 종속성 주입 과정에서 필요한 객체를 제공할 방법이 없을 때 나타납니다. 이 경우 UserData 객체에 대한 의존성을 해결하기 위해 적절한 제공 메커니즘을 설정해야 합니다. UserData가 객체로 정의되어 있기 때문에, 이 객체의 인스턴스를 주입할 수 있도록 Dagger 설정을 추가해야 합니다.

 

UserData 제공 설정

UserData는 이미 object로 선언되어 있으므로, Dagger 모듈에서 이를 직접 제공하는 방법으로 접근할 수 있습니다.UserData를 Dagger 컨테이너에 등록하여 다른 컴포넌트에서 UserData를 주입받을 수 있도록 설정합니다. 이를 위해 @Provides와 @Singleton 어노테이션을 사용하여 UserData 객체를 제공하는 메서드를 만들어야 합니다.

 

@Provides의 의미

@Provides 어노테이션은 Dagger에게 특정 객체를 생성하거나 제공하는 방법을 명시하는 데 사용됩니다. 즉, Dagger가 종속성 그래프에서 필요한 객체를 어떻게 생성하고 제공해야 하는지 알려주는 역할을 합니다. 이 어노테이션은 모듈 클래스의 메서드에 사용되며, 해당 메서드가 반환하는 객체를 Dagger가 관리하게 됩니다.

예를 들어, 다음과 같이 @Provides 어노테이션이 사용된 메서드를 정의하면, Dagger는 이 메서드를 호출하여 UserData 객체를 제공할 수 있습니다

@Provides
fun provideUserData(): UserData {
    return UserData
}

 

수정된 AppModule

  1. UserData 제공 설정: UserData 객체를 Dagger 모듈에서 제공하도록 설정합니다. UserData는 object로 선언되어 있으므로 싱글턴 인스턴스를 제공하기 위해 @Singleton과 @Provides 어노테이션을 사용합니다.
  2. TokenAuthenticator 제공 설정: TokenAuthenticator 클래스는 ApiService와 UserData를 필요로 합니다. 이를 Dagger 모듈에서 @Provides 메서드를 통해 제공하며, UserData 인스턴스를 주입받도록 설정합니다.
@Module
@InstallIn(SingletonComponent::class)
object AppModule {
    @Singleton
    @Provides
    fun provideUserData(): UserData {
        return UserData
    }
    
    @Provides
    fun provideTokenAuthenticator(apiServiceProvider: Provider<ApiService>, userData: UserData): TokenAuthenticator {
        return TokenAuthenticator(apiServiceProvider, userData)
    }
}