티스토리 뷰

3. Dagger2란 무엇인가?

  • 자바와 안드로이드를 위한 강력하고 빠른 의존성 주입 프레임워크
  • 특징
    • 리플렉션을 사용하지 않음 (리플렉션 : 리플렉션은 구체적인 클래스 타입을 알지 못해도, 그 클래스의 메소드, 타입, 변수들을 접근할 수 있도록 해주는 자바 API)
    • 런 타임에 바이트 코드도 생성하지 않음
    • 컴파일 타임에 애노테이션 프로세서에 의해 의존성 주입과 관련된 모든 코드를 분석하고 자바 소스 코드를 생성

 

  • Dagger 전에는 자바 진영에서 Guice를 사용했는데 리플렉션을 사용 및 런 타임에 오브젝트 그래프를 구성하여 성능에 악영향을 끼치는 경우가 많았음
  • Guice와 비슷한 API를 가지며 더 빠른 Dagger1(2012) 이후 구글 코어 라이브러리 팀과 함께 Dagger2를 만들어 현재까지 발전
  • 프로젝트에 적용하기는 쉽지 않음. 가파른 학습 곡선. 중도 포기.
  • 하나씩 용어, 개념을 익히면 어렵지 않을 것.

 

  • Dagger의 장점
    1. 자원 공유의 단순화. 지정된 범위의 생명 주기 내에서 동일 인스턴스 제공
    2. 복잡한 의존성 -> 단순하게. 앱이 커질 수록 많은 의존성을 갖는데 Dagger가 이를 쉽게 제어해줌
    3. 유닛 테스트를 쉽게 도와줌
    4. 자동 코드 생성. 생성된 코드는 명확. 디버깅 가능.
    5. Dagger2 는 난독화 문제가 ㅇ벗음. (Dagger1은 리플렉션 사용으로 난독화, 성능에 문제..)
    6. 라이브러리 크기가 작음

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 프로젝트라면 kaptannotationProcessor 으로
  • 안드로이드 데이터 바인딩 라이브러리 사용시 바인딩 오류가 나면 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

 

 

NetLSS/AndroidCleanArchitecture

안드로이드 클린 아키텍처 (Dagger2, RxJava, JetPack ...). Contribute to NetLSS/AndroidCleanArchitecture development by creating an account on GitHub.

github.com

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-안드로이드 권장 애플리케이션 설계 원칙

해당 글은 '아키텍처를 알아야 앱 개발이 보인다' 를 공부하며 요약 정리한 글 입니다.
댓글
최근에 올라온 글
최근에 달린 댓글
네이버 이웃추가
«   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
글 보관함