Dagger2를 알아보자 – 기본편
Dagger2를 알아보자 – Scope 
Dagger2를 알아보자 – Injection의 종류 (You’re here)
Dagger2를 알아보자 – Qualifier 
Dagger2를 알아보자 – Binding 
Dagger2를 알아보자 – Multibinding
Dagger2를 알아보자 – SubComponent
Dagger2를 알아보자 – Android
Dagger2를 알아보자 – Testing(준비중)
Dagger2를 알아보자 – Dynamic Feature에 적용하기(준비중)


인젝션의 종류(Direct vs Lazy vs Provider)

인젝션의 종류에 대한 차이점은 위의 모듈을 통해 설명하겠습니다.

Direct injection

일반적인 인젝션인 경우입니다. 한번 주입받은 객체는 여러번 참조해도 처음 주입받은 같은 객체입니다.

결과:
computing…
printing…
100
100
100

Lazy injection

객체가 초기화하는데 시간이 필요하다면 Lazy 인젝션을 고려해볼수 있습니다. 바인딩 될 타입을 위해 Lazy<타입>을 만들어 주기만 하면됩니다. Lazy<타입> 객체의 get() 메소드를 호출 해주기 전까지는 객체가 초기화 되는것을 늦출 수 있습니다. Lazy 타입의 객체도 같은 그래프 내에서 싱글톤으로 관리 가능합니다.

get()메소드를 통해 얻은 객체 또한 초기화만 늦출뿐 매번 호출해도 같은 객체입니다. 그러므로 결과는 아래와 같습니다.

결과:
computing…
printing…
100
100
100

Provider injection

@Inject된 Provider에대해 get()이 호출될때마다 새로운 인스턴스가 만들어 집니다. 하나의 Provider 객체로 여러 인스턴스가 반환될 수 있습니다. 몇개의 옵션 (팩토리, 빌더 등)을 가지고있는 동안, T 대신에 Provider <T>를 주입하는 옵션이 있습니다. @Inject생성자에 대해서는 새로운 인스턴스를 만들지만, @Provides메소드에 대해서는 보장하지 않습니다.

대개의 경우 Provider를 사용하는것은 그래프내에서 잘못된 Scope나 설계패턴을 만들어낼 수 있습니다. 그래도 드물게 필요한 경우가 있으니 알아두시면 좋습니다. 

Provider로부터 get()을 호출하면 매번 새로운 객체를 생성하게 되어 다음과 같은 결과를 보입니다.

결과:
printing…
computing…
100
computing…
101
computing…
102

Buy me a coffeeBuy me a coffee

0개의 댓글

답글 남기기

이메일은 공개되지 않습니다.