안드로이드 Dagger2 (Dependency Injection, 의존성 주입)

|

https://github.com/google/dagger

Dagger란?

DI Framework이다.

DI (Dependency Injection) 란?

의존성 주입이란 외부에서 의존 객체를 생성하여 넘겨주는 것을 의미한다.
만약 A객체가 B, C 객체를 필요로 한다면 누군가가 setter나 생성자를 통해 필요한 객체를 주입해준다.

컨테이너란?

그렇다면 무엇인가를 넘겨주는 주체가 필요할 것이다. 이를 컨테이너 라고 한다.

IoC (Inversion of Control) 란?

의존성이 있는 객체의 제어를 외부 Framework로 올린 것이다. Dagger를 사용하면 IoC 개념을 구현 가능하다.

IoC의 장점 네가지

  • 작업을 구현하는 방식과 작업 수행 자체를 분리한다.
  • 모듈을 제작할 때, 모듈과 외부 프로그램의 결합에 대해 고민할 필요 없이 모듈의 목적에 집중할 수 있다.
  • 다른 시스템이 어떻게 동작할지에 대해 고민할 필요 없이, 미리 정해진 협약대로만 동작하게 하면 된다.
  • 모듈을 바꾸어도 다른 시스템에 부작용을 일으키지 않는다.

코드 재사용성, 테스트 용이성을 얻을 수 있다!

Dagger 익히기

Add depencency

// Add Dagger dependencies
dependencies {
  compile 'com.google.dagger:dagger:2.x'
  annotationProcessor 'com.google.dagger:dagger-compiler:2.x'
}

Inject

필요한 객체의 의존성 주입을 요청한다. 컨테이너가 객체를 생성하여 넘겨받는다.

@Inject
private lateinit var gson : Gson

Component

의존성을 요청받고 필요한 곳에 주입하는 Dagger의 주된 역할을 수행한다. 공급하는 Module과 주입받는 Inject 사이를 연결해주는 역할을 수행한다.

@Component(modules = MonitorModule.class)
public interface MonitorComponent {
    void inject(MainActivity activity);
}

Subcomponent

계층관계를 만들 수 있다. Dagger의 중요한 컨셉인 그래프를 형성한다. 주입을 요청받았을 때 Subcomponent에서 의존성을 검색하고, 없으면 부모로 올라가며 검색한다.

Module

Component에 연결되어 의존성 객체를 생성한다. 생성 후 Scope에 따라 관리도 한다. 필요한 객체를 제공하는 역할을 한다.

@Module
public class MonitorModule {

    @Provides
    Gson provideGson() {
       return new Gson();
    }
}

Scope

생성된 객체의 Lifecycle 범위이다. 안드로이드에서는 주로 Activity, Fragment의 생명주기와 맞추어 사용한다. Module에서 Scope를 보고 객체를 관리한다.

Inject, Module, Component 코드 설정 후 빌드

빌드를 하면 Dagger + {ComponentName} 파일이 자동으로 생성된다. 이는 컴파일 단계에서 의존성을 체크할 수 있어 앱의 안정성을 높여줄 수 있다.