본문 바로가기
Android개발/Dagger2

Dagger2 기본 #5 - Binding

by 궝테스트 2020. 5. 29.
'아키텍처를 알아야 앱 개발이 보인다' 책을 보며 정리 및 간단 리뷰를 남긴다
어느정도 아키텍처, dagger, rxJava, Jetpack 등의 선행학습 후 복습 차원에서 보면 좋을 것 같다


1. @Binds

  • Module 내 추상 메소드에 지정할 수 있다
  • 하나의 파라미터만 가져야 한다
  • 파라미터를 리턴 타입으로 바인드할 수 있으며, @Provides 메소드 대신 효율적으로 사용할 수 있다
  • ex) @Binds abstract fun bindRandom(secureRandom: SecureRandom) : Random
    • 이미 바인드된 SecureRandom 을 Random 타입으로 한 번 더 바인드 할 수 있다

2. @BindsOptionalOf

  • Module 내 추상 메소드에 지정할 수 있다
  • 파라미터를 가질 수 없다
  • Void 가 아닌 특정 타입을 리턴할 수 있으며, throw 도 던질 수 없다
  • ex) @BindsOptionalOf abstract fun bindsOptionalOfString() : String
  • 의존성 주입은 Optional 타입 등으로 주입된다
    • ex) @Inject str: Optional<String>
            @Inject str: Optional<Provider<String>>
            @Inject str: Optional<Lazy<String>>
  • Component 내에 주입 받을 클래스가 바인드된 적 있다면,
    Optonal 의 상태는 present, 반대는 absent 이다
  • @Nullable 바인딩은 허용하지 않으며 컴파일 타임 에러를 발생시킨다

3. @BindsInstance

  • @Component.Builder 의 Setter 메소드 또는 @Component.Factory 파라미터에 지정할 수 있다
  • Module 이 아닌 외부에서 생성된 인스턴스를 Builder/Factory 를 통해 넘겨
    Component 가 해당 인스턴스를 바인드하게 된다
  • @Inject 가 지정된 필드, 생성자, 메소드에 주입될 수 있다

4. Multi Binding

멀티 바인딩을 사용하면 여러 Module 에 있는 같은 타입의 객체를 하나의 Set/Map 으로 관리할 수 있다.

Set 멀티 바인딩

  • @IntoSet, @ElementsIntoSet 어노테이션을 @Provides 메소드랑 사용할 수 있다
  • @IntoSet 으로 Set<String> 타입으로 객체를 하나씩 추가하여 멀티 바인딩이 구현된다
    • ex) @Provides @IntoSet fun provideHello() : String = "Hello"
            @Provides @IntoSet fun provideWorld(): String = "World"
  • @ElementsIntoSet 으로 Set<String> 에 한꺼번에 추가할 수 있다
    • ex) @Provides @ElementsIntoSet fun provideSet() : Set<String> = hashSetOf("Hello""World")

Map 멀티 바인딩

  • @IntoMap 어노테이션을 @Provides 메소드랑 사용할 수 있다
  • Map 에는 key 가 필요하여 key 어노테이션도 함께 사용해야 한다
  • 기본 제공 key 어노테이션 : @StringKey, @ClassKey, @IntKey, @LongKey
    • ex) @Provides @IntoMap @StringKey("hello")
  • 커스텀 key 어노테이션 ex)
enum class Animal {
	DOG, CAT
}

// annotation class
@MapKey
@Retention(AnnotationRetention.RUNTIME)
annotation class AnimalKey(val value: Animal)

// Module
@Provides
@IntoMap
@AnimalKey(Animal.CAT)
fun provideCat() = "meow"


상속된 SubComponent 의 멀티 바인딩
: Component 로부터 멀티 바인드된 Set/Map 을 SubComponent 도 그대로 물려받을 수 있다 (책 예제 참고)


추상적인 멀티 바인딩 선언

  • Component 는 여러 Module 을 사용할 수 있어서 다른 Module 에 의해 멀티 바인드를 사용할 수도 있다
  • @Multibinds 어노테이션을 사용하여 Module 내 파라미터가 없는 추상 메소드를 사용할 수 있고,
    이 메소드의 리턴 타입이 Set/Map 이어야 한다
  • @ElementsIntoSet 만 사용해서 멀티 바인딩을 선언할 수도 있다 (책 예제 참고)

'Android개발 > Dagger2' 카테고리의 다른 글

Dagger2 기본 #4 - Component 의존 관계  (0) 2020.05.29
Dagger2 기본 #3 - Component  (0) 2020.05.29
Dagger2 기본 #2 - Module  (0) 2020.05.28
Dagger2 기본 #1 - 시작  (0) 2020.05.27
DI : Dependency Injection  (0) 2020.05.25

댓글