티스토리 뷰

Dagger를 통해 의존성 주입을 하던 중에, 같은 타입의 여러 객체를 제공하기 위해 @Named 어노테이션을 사용했는데, 다음과 같은 에러로 빌드가 되지 않았다. 

 

error: [Dagger/MissingBinding] @javax.inject.Named("identifier") someObject cannot be provided without an @Provides-annotated method.

 

원인

코틀린에서 프로퍼티(Property)는 기본적으로 필드(Field)접근자(getter/setter)로 구성되어 있다. 

그러나 자바필드(Field)만 존재하고 접근자는 별도로 구현해야 한다. 그렇기 때문에 코틀린어노테이션(annotation)은 자바와 같은 동작을 보장하기 위해 내부적으로 조금 더 복잡하다고 한다. 

 

우리가 원하는 것은 "프로퍼티(Property) 주입"이지만 Dagger에서는 "필드(Field)를 주입한다"라고 알아듣는다고 한다.

 

 

해결방법

 

해결방법은 의외로 간단했다.

 

객체를 제공하는 모듈(Module)에서는 다음과 같이 @Named("Identifier") 형식으로 어노테이션을 붙여주면 된다. 

그리고 외부 접근을 위해 @JvmStatic 어노테이션도 함께 선언해야 한다.

 

@Module
abstract class PreferenceModule {
    @Module
    companion object {
        @Provides
        @Singleton
        @Named("bluetooth")
        @JvmStatic // important!!!
        fun provideBlePreference(applicationContext: Context): RxkPrefs 
        	= rxkPrefs(applicationContext, "bluetooth")
    }
}

 

주입받는 곳에서는 @field:Named("Identifier") 형식으로 어노테이션을 붙여주면 된다.

 

class MyViewModel @Inject constructor(): ViewModel() {   
   
   @Inject @field:Named("bluetooth")
   lateinit var blePrefs: RxkPrefs
    
}    

 

이외로

 

드물게 Primitive 타입을 주입할 경우에는 @set:Named("Identifier") 어노테이션을 붙여주면 된다고 한다.

 

 

 

reference: https://medium.com/@WindRider/correct-usage-of-dagger-2-named-annotation-in-kotlin-8ab17ced6928

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함