Image
Android/Dependency Injection

[Dagger2] 3. Component Injection 메서드 - 프로비전(Provision)

Interface로서의 Component

앞서 Component는 Interface의 역할을 한다고 하였다. Component Interface에서 제공되는 함수는 두 가지가 있을 수 있다. 하나는 프로비전 메서드로 그 자체로 Provider에 의해 반환되는 인스턴스를 반환하는 메서드이며, 다른 하나는 멤버 인젝션 메서드로 인자로 받는 인스턴스에 Provider에 의해 반환되는 인스턴스를 제공하는 메서드이다. 우리는 이 둘을 다음과 같이 부른다.

프로비전(Provision) 메서드 
그 자체로 Provider에 의해 만들어진 인스턴스나, 프로퍼티가 주입된 인스턴스를 반환하는 메서드
멤버 인젝션(Member Injection) 메서드
인자로 받는 인스턴스에 Provider에 의해 반환되는 인스턴스를 제공하는 메서드

이제부터 두가지가 어떻게 다른지 알아볼 것이다. 이 글에서는 프로비전 메서드만 다루고 다음 글에서 멤버 인젝션 메서드를 다룬다.

 

프로비전(Provision) 메서드

*프로비전 메서드는 예제2에서 다룬다.

예제2는 다음과 같은 코드 구조를 가진다.

예제 링크 : https://github.com/seyoungcho2/Dagger2Example

그림1. 예제2 코드구조

@Component(modules = [PersonModule::class])
interface PersonComponent{
    fun getString() : String
    fun getStudent() : Student
}
@Module
class PersonModule {
    @Provides
    fun providesString() = "Example2 Student"
}

*Student는 아래에서 필요할 때 다룬다.

 

 

Provider에 의해 만들어진 인스턴스 반환

먼저 Provider에 의해 만들어진 인스턴스 반환에 대해 살펴보자. 말 그대로 Provider에 의해 반환된 값을 Component에서 반환하는 경우이다.

 

PersonComponent Interface의 getString()메서드는 String 값을 반환하는데 이는 PersonModule의 providesString()메서드에서 해당 값을 제공(Provide)하고 있다.

 

따라서 우리가 다음의 코드를 호출했을 때 Example2 Student가 반환된다.

fun main(){
    val personComponent : PersonComponent = DaggerPersonComponent.create()
    val string = personComponent.getString() // Example2 Student
}

이를 시각적으로 표현하면 다음과 같다.

그림2. Provider에 의해 만들어진 인스턴스 반환

 

 

Provider에 의해 프로퍼티가 주입된 인스턴스 반환

Dagger2는 생각보다 똑똑하다. 클래스A의 생성자에 주입되어야 하는 프로퍼티가 프로바이더에 의해 제공되는 경우에도 클래스A를 반환할 수 있다.

 

예를들어 String을 인자로 갖는 Student가 있다고 해보자. 코드는 다음과 같다.

data class Student @Inject constructor(
    val name: String
)

Student는 name을 인자로 받는 생성자를 주입(Inject) 받는다.

 

자 이제 위의 Student를 반환받는다고 해보자. 이 때 val name: String은 PersonModule의 provideString() 메서드에 의해 제공되므로 PersonComponent의 fun getStudent()는 String이 Inject된 Student 인스턴스를 반환한다.

 

따라서 <그림3>과 같은 과정으로 주입 및 반환이 진행된다.

그림3. Provider에 의해 프로퍼티가 주입된 인스턴스 반환

이를 통해 PersonComponent는 Student 인스턴스를 제공할 수 있게 된다.

 

 

정리

Component의 프로비전 메서드는 프로바이더에 의해 제공된 인스턴스 그 자체 혹은 Provider에 의해 프로퍼티가 주입된 인스턴스를 반환할 때 사용한다.

 

 

다음 글에서는 Component의 멤버 인젝션 메서드를 다룬다.

 

반응형

 

이 글의 저작권은 '조세영의 Kotlin World' 에 있습니다. 글, 이미지 무단 재배포 및 변경을 금지합니다.

 

 

Kotlin, Android, Spring 사용자 오픈 카톡

오셔서 궁금한 점을 질문해보세요!
비밀번호 : kotlin22

open.kakao.com