앞전에서 Hilt는 Dagger를 기반으로 만들어진 DI 라이브러리임을 알 수 있었는데,
사실 Dagger도 초반에만 사용하고, 그 뒤로 안 써봐서 어노테이션이 정확히 기억나지 않아요 :(
그래서 주요 어노테이션들을 복습하는 시간을 가지고, Hilt 공식 문서를 보는 공부방식으로 정했어요 !
까먹는거.. 저만 그런거 아니잖아요..?
아주 간단한 예제를 통해서 주요 Annotation을 다시 복습해보겠습니다 ✏️
1. @Module, @Provides
Component에 의존성을 제공하는 역할을 합니다
모듈 클래스를 만드는 방법은 @Module만 붙여주면 됩니다
그리고 그 안에 선언되는 메소드들에는 @Provides가 붙어요 :)
간단한 코드를 예시로 보자면,
@Module
class MainModule {
@Provides
fun provideSimple(): String{
return "의존성을 제공하는 메소드입니다"
}
}
Component에서 Module에서 어떤 의존성을 제공했는지는 Component 내 메서드의 반환형을 보고 매칭합니다
이 말인 즉슨, Module안에 같은 반환형을 제공하는 프로바이더가 있으면 에러가 발생해요 :(
💡 @Module(includes=[모듈클래스들])
includes를 사용하면 다른 모듈클래스에 있는 Provides를 상속받을 수 있습니다
이 경우도 중복타입을 존재시키면 X
2. @Component
의존성을 제공하는 모듈로부터 객체를 생성하고 요청받은 instance에 해당 객체를 제공합니다
DI의 핵심역할을 하는 곳이에요
interface 혹은 abstract class에만 붙일 수 있는 Annotation 입니다
아래처럼 그림으로 이해하는게 쉬워요 :)
@Component의 modules= 모듈클래스의 배열을 선언해주면 됩니다
@Component(modules = [MainModule::class])
interface MainComponent {
fun getSimple(): String
}
💡 Component Method
1. Provision
매개 변수가 없고 Module이 제공하는 객체타입을 반환형으로 가지는 유형
fun getSimple(): String
2. Member-injection Method
인자로 받은 Component 내부에 @inject가 붙은 필드에 DI
fun inject(activity: MainActivity)
1을 사용한 방법은 위에서 설명된 코드이구요
2를 사용한다면, 아래와 같습니다
@Inject를 사용할 클래스를 선언하고,
class MainClass {
@Inject
lateinit var str : String
init {
str = "simple"
}
fun getSimple(): String {
return str
}
}
모듈은 위와 동일하므로 생략하겠습니다 :)
Component는 inject가 있는 클래스 전체를 받는 형식으로 변경됩니다
@Component(modules = [MainModule::class])
interface MainComponent {
fun inject(main: MainClass) //member-injection
}
Unit 테스트 확인 코드
val act = MainClass()
val component = DaggerMainComponent.create()
component.inject(act)
var test = act.getSimple()
assertEquals("simple", test)
https://github.com/eunie9498/SimpleDagger2
'📱 Android' 카테고리의 다른 글
[Jetpack] Navigation Component #1 기본 뼈대 만들기 (0) | 2023.04.30 |
---|---|
[Jetpack] LiveData와 ViewModel (0) | 2023.03.23 |
[Android] Clean Architecture (0) | 2023.01.08 |
[Android] SOLID 원칙 (0) | 2023.01.08 |
[Hilt] 코드랩으로 Hilt 익히기 # 1 (0) | 2023.01.07 |