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)
해당 글은 '아키텍처를 알아야 앱 개발이 보인다' 를 공부하며 요약 정리한 글 입니다.
'Android > 클린 아키텍처' 카테고리의 다른 글
[Clean Architecture] 09-Lazy 주입 & Provider 주입 (dagger) (0) | 2021.07.23 |
---|---|
[Clean Architecture] 08-Dagger2의 컴포넌트(Component) (0) | 2021.07.22 |
[Clean Architecture] 06-Dagger2 란? (+ Adnroid 적용 샘플) (0) | 2021.07.20 |
[Clean Architecture] 05-의존성 주입(DI)과 그 필요성 (0) | 2021.07.19 |
[Clean Architecture] 04-안드로이드 앱 설계 패턴 (MVC, MVP, MVVM) (0) | 2021.07.19 |