'아키텍처를 알아야 앱 개발이 보인다' 책을 보며 정리 및 간단 리뷰를 남긴다
어느정도 아키텍처, dagger, rxJava, Jetpack 등의 선행학습 후 복습 차원에서 보면 좋을 것 같다
Component 에 의존성을 제공하는 역할로 클래스에 @Module 어노테이션을 붙이면된다.
1. @Provides 메소드
- Module 클래스에서 선언되는 메소드에는 @Provides 어노테이션을 붙이며,
컴파일 타임에 의존성을 제공하는 바인드된 Provider 를 생성한다 - 리턴 타입으로 Component 내에서 의존성이 관리되기 때문에
하나의 Component 에는 리턴 타입이 중복되면 안된다 (중복 시 컴파일 타임에 에러 발생) - 메소드는 null 을 리턴해야 할 경우 @Nullable 을 추가해야하며, 코틀린의 경우 ? 추가하면 된다
(@Nullable 이 없을 경우, 컴파일 타임에 NPE 발생) - 보통 메소드명은 prefix 로 'provide' 를 붙인다
ex) fun provideName() - Component 내 바인드된 메소드의 리턴 타입은 @Provides 메소드의 파라미터로 사용할 수 있다
- Module 클래스가 추상 클래스이면 @Provides 메소드는 static 이어야 한다
2. 상속
- @Module 어노테이션 속성 중 includes 를 사용하여 다른 Module 클래스를 배열로 정의할 수 있다
- 위 정의로 @Provides 메서드 상속이 가능하다
- Module 간 상속 시 @Provides 메소드 리턴 타입이 중복되면 안된다
@Module
class ParentModule {
@Provides
fun provideHelloWorld() : String? = "Hello World"
}
// ParentModule 을 상속 받음
@Module(includes = [ParentModule::class])
class ChildModule {
@Provides
fun provideInteger() : Int? = null
}
@Component(modules = [ChildModule::class])
interface HelloComponent {
fun getString() : String?
fun getInteger() : Int?
}
// TestCode
class ExampleUnitTest {
@Test
fun testHelloWorld() {
val helloComponent = DaggerHelloComponent.create()
println("- result1 = ${helloComponent.getString()}")
println("- result2 = ${helloComponent.getInteger()}")
}
}
/**
* TestCode result
* - result1 = Hello World
* - result2 = null
*/
'Android개발 > Dagger2' 카테고리의 다른 글
Dagger2 기본 #5 - Binding (0) | 2020.05.29 |
---|---|
Dagger2 기본 #4 - Component 의존 관계 (0) | 2020.05.29 |
Dagger2 기본 #3 - Component (0) | 2020.05.29 |
Dagger2 기본 #1 - 시작 (0) | 2020.05.27 |
DI : Dependency Injection (0) | 2020.05.25 |
댓글