728x90

Hilt 를 이용한 DI에서,

구현체를 만들 때 3가지 어노테이션을 사용할 수 있다.

 

간단히 플로우차트로 나타내면 아래와 같다.

 

 

 

가장 간단한 케이스로, constructor 가 존재하여

1. 모듈이 필요없는 의존성 주입

@Inject constructor(param….) 

class DateFormatter @Inject constructor() {

    @SuppressLint("SimpleDateFormat")
    private val formatter = SimpleDateFormat("d MMM yyyy HH:mm:ss")

    fun formatDate(timestamp: Long): String {
        return formatter.format(Date(timestamp))
    }
}

위 코드는 구글의 Hilt codelab Solution에서 가져왔다.

 

2. 모듈이 필요한 의존성 주입 (constructor 없음)

 

Constructor가 없는 이유에 따라 해결법이 갈린다.

a. 외부라이브러리임, 빌더패턴임

b. Interface 임

 

@Module, @InstallIn(...) 의 어노테이션이 있는 

모듈 클래스 내부에 @Provides, @Binds 어노테이션이 붙은 함수를 이용한다.

주의 - 둘은 섞어서 쓸 수 없음...

 

2-a. @Provides 어노테이션

외부라이브러리나 빌더패턴의 경우에 사용

코드랩 솔루션 일부 (ApplicationComponent 는 현재 Deprecated -> Delete 되었으나 이 글은 @Provides 를 설명하는 글이지 scope를 설명하는 글이 아니고, 코드랩에는 아직 이게 나와있어서 그냥 복붙,,, 이제 쓸일없는 코드)

@InstallIn(ApplicationComponent::class)
@Module
object DatabaseModule {

    @Provides
    @Singleton
    fun provideDatabase(@ApplicationContext appContext: Context): AppDatabase {
        return Room.databaseBuilder(
            appContext,
            AppDatabase::class.java,
            "logging.db"
        ).build()
    }
    //...
}

 

 

2-b. @Binds 어노테이션

 

인터페이스를 주입할 때 필요한 정보를 제공하는 역할.

추상함수 형태로 제공 (따라서 이것을 포함하는 Module class역시 추상 class 가 된다.) -> Binds 와 Provides 를 섞어쓸 수 없는 이유

역할 : 인터페이스클래스와 구현체 클래스를 알려줌 

  • 리턴타입 : 어떤 인터페이스 인스턴스를 제공하는지 알려줌
  • 파라미터 타입 : 인터페이스를 상속하는 녀석들중에 어떤 구현체를 제공할지 Hilt 에 알려줌

 

@InstallIn(ActivityComponent::class)
@Module
abstract class LoggingInMemoryModule{

    @ActivityScoped
    @Binds
    abstract fun bindInMemoryLogger(impl: LoggerInMemoryDataSource) : LoggerDataSource
}


아마도 함수가 사용안됨으로 표시될건데

@Inject 하면 그렇게 표시되더라도 Inject 하는 곳으로 안내됨..(?) 즉, 신경쓸필요없음

 

 

위의 세 방식으로 힐트에게 의존성 주입 방법에 대해 알려주었다.

 

Binds 나 Provides 는 같은 인터페이스/클래스에 대해 각기 다른 구현을 여러개 가질 수 있다.

이렇게 여러 구현이 있는 경우 @Qualifier 로 어떤 구현을 사용할지 구분할 수 있다.

 

 

나도 힐트 초보자이고, 사용법 가이드라기보다는 개념을 이해하기위해 쓴 글이기때문에 엄밀하지 않은 부분이 있을 수 있다.

틀린부분을 댓글로 달아주시면 감사감사... 

 

더보기
728x90

+ Recent posts