본문 바로가기
Android개발/Dagger2

Dagger2 기본 #2 - Module

by 궝테스트 2020. 5. 28.
'아키텍처를 알아야 앱 개발이 보인다' 책을 보며 정리 및 간단 리뷰를 남긴다
어느정도 아키텍처, 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

댓글