'아키텍처를 알아야 앱 개발이 보인다' 책을 보며 정리 및 간단 리뷰를 남긴다
어느정도 아키텍처, dagger, rxJava, Jetpack 등의 선행학습 후 복습 차원에서 보면 좋을 것 같다
1. @Binds
- Module 내 추상 메소드에 지정할 수 있다
- 하나의 파라미터만 가져야 한다
- 파라미터를 리턴 타입으로 바인드할 수 있으며, @Provides 메소드 대신 효율적으로 사용할 수 있다
- ex) @Binds abstract fun bindRandom(secureRandom: SecureRandom) : Random
- 이미 바인드된 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>>
- ex) @Inject str: Optional<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"
- ex) @Provides @IntoSet fun provideHello() : String = "Hello"
- @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 |
댓글