3. Dagger2란 무엇인가?
- 자바와 안드로이드를 위한 강력하고 빠른 의존성 주입 프레임워크
- 특징
- 리플렉션을 사용하지 않음 (
리플렉션 : 리플렉션은 구체적인 클래스 타입을 알지 못해도, 그 클래스의 메소드, 타입, 변수들을 접근할 수 있도록 해주는 자바 API
) - 런 타임에 바이트 코드도 생성하지 않음
- 컴파일 타임에 애노테이션 프로세서에 의해 의존성 주입과 관련된 모든 코드를 분석하고 자바 소스 코드를 생성
- 리플렉션을 사용하지 않음 (
- Dagger 전에는 자바 진영에서 Guice를 사용했는데 리플렉션을 사용 및 런 타임에 오브젝트 그래프를 구성하여 성능에 악영향을 끼치는 경우가 많았음
- Guice와 비슷한 API를 가지며 더 빠른 Dagger1(2012) 이후 구글 코어 라이브러리 팀과 함께 Dagger2를 만들어 현재까지 발전
- 프로젝트에 적용하기는 쉽지 않음. 가파른 학습 곡선. 중도 포기.
- 하나씩 용어, 개념을 익히면 어렵지 않을 것.
- Dagger의 장점
- 자원 공유의 단순화. 지정된 범위의 생명 주기 내에서 동일 인스턴스 제공
- 복잡한 의존성 -> 단순하게. 앱이 커질 수록 많은 의존성을 갖는데 Dagger가 이를 쉽게 제어해줌
- 유닛 테스트를 쉽게 도와줌
- 자동 코드 생성. 생성된 코드는 명확. 디버깅 가능.
- Dagger2 는 난독화 문제가 ㅇ벗음. (Dagger1은 리플렉션 사용으로 난독화, 성능에 문제..)
- 라이브러리 크기가 작음
04. 프로젝트에 Dagger 설정하기
- 안드로이드 프로젝트 모듈 수준 그레이들에 아래 의존성을 추가합니다.
[app/build.gradle]
implementation 'com.google.dagger:dagger-android:2.35.1'
implementation 'com.google.dagger:dagger-android-support:2.35.1'
kapt 'com.google.dagger:dagger-android-processor:2.35.1'
kapt 'com.google.dagger:dagger-compiler:2.35.1'
- java 프로젝트라면
kapt
를annotationProcessor
으로 - 안드로이드 데이터 바인딩 라이브러리 사용시 바인딩 오류가 나면 javac에 의해 오류 메세지가 출력됨. Dagger와 같이 사용하면 Dagger 관련 오류 발생 시 데이터 바인딩 컴파일이 멈추며 오류 메세지가 100줄 이상 뜨는데 이를 더 확인하기 위해 아래와 같은 코드가 필요
android {
...
gradle.projectsEvaluated{
tasks.withType(JavaCompile){
options.compilerArgs << "-Xmaxerrs"<< "500"
}
}
}
05. 첫 번째 의존성 주입 구현하기
- "Hello World" 문자열 주입 예제
[MyModule.kt]
import dagger.Module
import dagger.Provides
@Module
class MyModule {
@Provides
fun provideHelloWorld(): String = "Hello World"
}
- 문자열을 제공할 모듈 클래스
- Dagger는 컴파일 타임의 의존서 주입에 필요한 어노테이션을 읽어서 의존성 주입에 필요한 클래스 파일들을 생성
@Module
: 의존성을 제공하는 클래스에 붙여준다. (이후 포스팅에서 더 자세히 학습해볼 것임)@Provides
: 의존성을 제공하는 매서드에 붙여준다. (이후 포스팅에서 더 자세히 학습해볼 것임)- 사실, MyModule 클래스 하나만으로는 별도 클래스 파일이 생기지않으며. 모듈을 참조하는 컴포넌트가 있어야한다.
[MyComponent.kt]
import dagger.Component
@Component(modules = [MyModule::class])
interface MyComponent {
fun getString(): String // 프로비전 메서드, 바인드된 모듈로부터 의존성을 제공
}
- 제공할 의존성에 대한 메서드를 정의
@Component
에 참조된 모듈 클래스로부터 의존성을 제공받는다.- 컴포넌트 메서드의 봔환 타입을 보고 모듈과 관계를 맺으므로 바인드된 모듈로 부터 해당 반환형을 갖는 메서드를 못찾으면 컴파일 타임 에러 발생.
- Dagger 가 생성한 클래스는 Dagger 라는 접두사가 붙는다. (
@Component
를 구현한 클래스 생성)
확인 해보자 (참고로 Dagger 클래스가 빨간줄로 표기된다면 빌드를 한번 해주면 된다.)
class ExampleUnitTest {
@Test
fun test_helloWorld(){
val myComponent = DaggerMyComponent.create()
println("result = ${myComponent.getString()}")
}
}
result = Hello World
2021.07.19 - [Android/클린 아키텍처] - [Clean Architecture] 05-의존성 주입(DI)과 그 필요성
2021.07.19 - [Android/클린 아키텍처] - [Clean Architecture] 04-안드로이드 앱 설계 패턴 (MVC, MVP, MVVM)
2021.07.17 - [Android/클린 아키텍처] - [Clean Architecture] 03-안드로이드 권장 애플리케이션 설계 원칙
해당 글은 '아키텍처를 알아야 앱 개발이 보인다' 를 공부하며 요약 정리한 글 입니다.
'Android > 클린 아키텍처' 카테고리의 다른 글
[Clean Architecture] 08-Dagger2의 컴포넌트(Component) (0) | 2021.07.22 |
---|---|
[Clean Architecture] 07-Dagger2의 모듈(Module) (0) | 2021.07.21 |
[Clean Architecture] 05-의존성 주입(DI)과 그 필요성 (0) | 2021.07.19 |
[Clean Architecture] 04-안드로이드 앱 설계 패턴 (MVC, MVP, MVVM) (0) | 2021.07.19 |
[Clean Architecture] 03-안드로이드 권장 애플리케이션 설계 원칙 (2) | 2021.07.17 |