Interface로서의 Component
앞서 Component는 Interface의 역할을 한다고 하였다. Component Interface에서 제공되는 함수는 두 가지가 있을 수 있다. 하나는 프로비전 메서드로 그 자체로 Provider에 의해 반환되는 인스턴스를 반환하는 메서드이며, 다른 하나는 멤버 인젝션 메서드로 인자로 받는 인스턴스에 Provider에 의해 반환되는 인스턴스를 제공하는 메서드이다. 우리는 이 둘을 다음과 같이 부른다.
프로비전(Provision) 메서드
그 자체로 Provider에 의해 만들어진 인스턴스나, 프로퍼티가 주입된 인스턴스를 반환하는 메서드
멤버 인젝션(Member Injection) 메서드
인자로 받는 인스턴스에 Provider에 의해 반환되는 인스턴스를 제공하는 메서드
이제부터 두가지가 어떻게 다른지 알아볼 것이다. 이 글에서는 프로비전 메서드만 다루고 다음 글에서 멤버 인젝션 메서드를 다룬다.
프로비전(Provision) 메서드
*프로비전 메서드는 예제2에서 다룬다.
예제2는 다음과 같은 코드 구조를 가진다.
예제 링크 : https://github.com/seyoungcho2/Dagger2Example
@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
}
이를 시각적으로 표현하면 다음과 같다.
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>과 같은 과정으로 주입 및 반환이 진행된다.
이를 통해 PersonComponent는 Student 인스턴스를 제공할 수 있게 된다.
정리
Component의 프로비전 메서드는 프로바이더에 의해 제공된 인스턴스 그 자체 혹은 Provider에 의해 프로퍼티가 주입된 인스턴스를 반환할 때 사용한다.
다음 글에서는 Component의 멤버 인젝션 메서드를 다룬다.