본문 바로가기
Android개발/Dagger2

Dagger2 기본 #1 - 시작

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

댓글