'아키텍처를 알아야 앱 개발이 보인다' 책을 보며 정리 및 간단 리뷰를 남긴다
어느정도 아키텍처, dagger, rxJava, Jetpack 등의 선행학습 후 복습 차원에서 보면 좋을 것 같다
1. Dagger2 란?
- JAVA 와 Android 를 위한 DI 프레임워크
- Reflection 을 사용하지 않는다
- 런타임 시 바이트 코드를 생성하지 않는다
- 컴파일 타임에 Annotation processor 에 의해 DI 와 관련된 코드를 분석하고 자바 코드를 생성한다
2. Dagger 진입장벽
- Annotation 기반 코드 생성이 익숙치 않으면 내부 동작을 유추하기 힘들다
- Component, Subcomponent, Module 등 Dagger 에서만 사용하는 용어로 인해 혼란스럽다
3. Dagger 장점
- 자원 공유 단순화 : 지정된 범위의 생명주기 내에서 동일 인스턴스를 제공한다
- 복잡한 의존성을 단순하게 설정함
- 유닛 테스트가 쉬워진다
- 자동 코드 생성으로 생성된 코드는 명확하고 디버깅이 가능하다
- 난독화 문제가 없다
- 라이브러리 크기가 작다
4. Dagger2 를 사용하는 프로젝트를 설정해보자
// app/build.gradle
dependencies {
def dagger_version = "2.27"
// dagger2 : https://github.com/google/dagger/releases
implementation "com.google.dagger:dagger-android:$dagger_version"
implementation "com.google.dagger:dagger-android-support:$dagger_version"
kapt "com.google.dagger:dagger-android-processor:$dagger_version"
kapt "com.google.dagger:dagger-compiler:$dagger_version"
}
코틀린을 사용중이라 annotationProcessor 대신 kapt 로 사용한다.
// app/build.gradle
android {
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
// 필요한 에러 메세지가 500줄 이내에 없다면 숫자 변경 가능
options.compilerArgs << "-Xmaxerrs" << "500"
}
}
}
데이터 바인딩과 Dagger 를 함께 사용하면,
Dagger 관련 에러 발생 시 데이터 바인딩 컴파일을 멈추고 에러 메세지가 100줄 이상 출력된다.
에러 메세지 확인을 위해 위와 같은 코드를 설정한다.
5. Dagger 간단 예제
: Dagger 본격 진입 전 간단 예제를 통해 대-충 훑어본다,,
// HelloModule.kt : 의존성을 제공하는 클래스
@Module // 의존성을 제공하는 클래스에 작성
class HelloModule {
@Provides // 의존성을 제공하는 메서드에 작성
fun provideHelloWorld() : String? = "Hello World"
}
Dagger 는 컴파일 타임에 애노테이션(@Module, @Provides) 을 읽고 의존성 주입에 필요한 클래스 파일을 생성한다.
그러나 지금 위 HelloModule 클래스 하나로는 별도의 클래스 파일이 생성되지 않는다.
Module 을 참조하는 Component 가 없기 때문이다.
// HelloComponent.kt
@Component(modules = [HelloModule::class])
interface HelloComponent {
fun getString() : String?
}
@Component 에 참조된 모듈 클래스로붜 의존성을 제공받으며, 제공 할 의존성들은 메소드로 정의해야한다.
위 메소드의 리턴 타입을 보고 모듈과 바인딩되며, 해당되는 반환형이 없다면 컴파일 타임 에러가 발생할 것이다.
Dagger 는 컴파일 타임에 @Component 를 구현한 클래스를 생성하며 prefix 로 Dagger 가 붙는다.
ex) DaggerHelloComponent
'Android개발 > Dagger2' 카테고리의 다른 글
Dagger2 기본 #5 - Binding (0) | 2020.05.29 |
---|---|
Dagger2 기본 #4 - Component 의존 관계 (0) | 2020.05.29 |
Dagger2 기본 #3 - Component (0) | 2020.05.29 |
Dagger2 기본 #2 - Module (0) | 2020.05.28 |
DI : Dependency Injection (0) | 2020.05.25 |
댓글