📱 Android

[Hilt] Hilt 익히기 #2 - Dagger 복습하기 (주요 Annotation)

콩드로이드 2023. 1. 30. 18:40

앞전에서 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

 

GitHub - eunie9498/SimpleDagger2: Dagger2 복습을 위한 Simple Project

Dagger2 복습을 위한 Simple Project . Contribute to eunie9498/SimpleDagger2 development by creating an account on GitHub.

github.com