티스토리 뷰

06. 모듈

  • 컴포넌트에 의존 성을 제공하는 역할 (@Module 이 붙은 클래스)

프로바이더

  • 모듈 클래스 내 메서드에 @Provides 어노테이션을 붙여서 컴파일 타임에 의존성을 제공하는 바인드된 프로바이드를 만들 수 있다
  • 반환 타입을 보게되는데 이때 컴포넌트 내에 중복되는 반환타입이 있으면 안된다.
import dagger.Module
import dagger.Provides

@Module
class MyModule {
    @Provides
    fun provideHelloWorld(): String = "Hello World"

    @Provides
    fun provideSSLee(): String = "Lee Sang Su" // error!
}
  • 또는 컴포넌트에 바인드된 메서드의 반환형은 @Provides 메서드의 매개변수로 사용할 수 있다.
import dagger.Module
import dagger.Provides

@Module
class MyModule {
//    @Provides
//    fun provideHelloWorld(): String = "Hello World"

    @Provides
    fun provideName():String = "SangSuLee"

    @Provides
    fun provideInt():Int = 1234

    @Provides // name, age 를 제공 받음 (위)
    fun providePerson(name: String, age: Int): Person = Person(name, age)
}
  • providePerson()은 그 위에서 String, int 타입을 제공 받는다.
  • 매개 변수 타입에 맞는 의존성이 컴포넌트와 컴포넌트와 바인드된 모듈에 없으면 에러가 발생한다.
@Component(modules = [MyModule::class])
interface MyComponent {
    fun getString(): String // 프로비전 메서드, 바인드된 모듈로부터 의존성을 제공
    fun getInt(): Int
    fun getPerson(): Person
}
  • 모듈 클래스가 추상 클래스인 경우 @Provides 메서드는 static 메서드 이어야함
@Module
abstract class MyModule{
    companion object{
        @Provides
        fun provideName(): String {
            return "SangSuLee"
        }
    }
}

Null의 비허용

  • @Provides 메서드는 null을 반환하는 것을 기본적으로 제한.
  • null 반환을 명시적으로 허용할 경우 @Nullable
    • 의존성 제공하는 부분과, 주입받는 쪽이 둘다 @Nullable 이어야함
@Module
class MyModule {
//    @Provides
//    fun provideHelloWorld(): String = "Hello World"

    @Provides
    fun provideName():String = "SangSuLee"

    @Provides
    @Nullable
    fun provideInt(): Int? = 1234

    @Provides
    fun providePerson(name: String, age: Int): Person = Person(name, age)
}
@Component(modules = [MyModule::class])
interface MyComponent {
    fun getString(): String // 프로비전 메서드, 바인드된 모듈로부터 의존성을 제공
    @Nullable
    fun getInt(): Int
    fun getPerson(): Person
}
  • @Provides 매서드 뿐만 아니라 멤버-인젝션 메서드를 써서 null을 주입하는 경우에도 멤버 변수에 @Nullable이 꼭 붙어야함

모듈의 상속

  • @Module이 가질 수 있는 속성 중 includes라는 것이 있는데
  • includes에 다른 모듈 클래스들의 배열을 정의하는 것만으로도 @Provides 매서드의 상속이 가능함

[ModuleB가 BoduleA를 상속하는 코드]

@Module
class ModuleA {
    @Provides
    fun provideA(): A = A()
}

class A{}
@Module(includes = [ModuleA::class])
class ModuleB {
    @Provides
    fun provideB() = B()
}

class B{}
  • 이제 ModuleB를 참조하는 경우 ModuleA를 상속해 A 타입 객체도 바인딩 된다.
  • 주의점 : 모듈 간 상속 시 중복 타입이 존재하면 안된다.
    • 주의해야 보일러 플레이트 코드를 많이 제거 가능
      • 보일러 플레이트 코드 : 상용구 코드, 변경 없이 재사용 가능한 코드 or 비슷한 형태로 반복되는 코드

2021.07.20 - [Android/클린 아키텍처] - [Clean Architecture] 06-Dagger2 란? (+ Adnroid 적용 샘플)

2021.07.19 - [Android/클린 아키텍처] - [Clean Architecture] 05-의존성 주입(DI)과 그 필요성

2021.07.19 - [Android/클린 아키텍처] - [Clean Architecture] 04-안드로이드 앱 설계 패턴 (MVC, MVP, MVVM)

해당 글은 '아키텍처를 알아야 앱 개발이 보인다' 를 공부하며 요약 정리한 글 입니다.
댓글
최근에 올라온 글
최근에 달린 댓글
네이버 이웃추가
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함