오늘도 더 나은 코드를 작성하였습니까?

Dagger2 (안드로이드 의존성 주입 프레임워크)란? 본문

DI/Dagger2

Dagger2 (안드로이드 의존성 주입 프레임워크)란?

hik14 2020. 8. 4. 16:45

Dagger2란?

 

- 자바와 안드로이드를 위한 의존성 주입 프레임워크다.

- 리플렉션을 사용하지 않는다.

- 런 타임 시에 바이트 코드도 생성하지 않는다.

- 컴파일 타임에 Annotation 프로세서의 의해 의존성 주입과 관련된 코드를 이용해 코드를 생성한다.

 

장점

 

자원공유의 단순화 및 지정된 범위의 생명주기 내에서 동일한 Instance를 제공한다.

- 복잡한 의존성을 단순하게 설정할 수 있다.

- 유닛 테스트를 쉽게 할 수 있다.

- 자동 코드 생성을 통해 디버깅이 가능하다.

 

핵심 개념

Dagger WorkFlow

 

@Module (제공하는 방법을 정의한다. 어떻게 제공할지) 

- 모듈은 Component를 통해 Instance 또는 데이터를 제공한다.

- 제공하는 메소드를 @Provides 어노테이션을 통해 지정한다

 

@Component(무엇을 제공할지 정의한다.)

- 의존성 그래프(container)를 생성하여 무엇을 주입할지 정한다.

- 모듈을 입력받아 그래프를 완성하고 주입한다. 

 

@Inject(어디서 무엇을 받을것인지 정의한다.)

- 생성자에 붙히면 어떻게 생성하여 주입하는지 정한다.

-  주입될 field를 지정할때도 사용한다.

 

안드로이드 스튜디오를 통한 간단예제

dependencies {
    def dagger_version = 2.27; // 최신버전 사용
    
    //... 기존 의존성...

    implementation "com.google.dagger:dagger-android:$dagger_version"
    implementation "com.google.dagger:dagger-android-support:$dagger_version"
    annotationProcessor "com.google.dagger:dagger-android-processor:$dagger_version"
    annotationProcessor "com.google.dagger:dagger-compiler:$dagger_version"
}

// 코틀린의 경우 annotationProcessor --> kapt로 변경후 그레이들 싱크.

Module Class

import dagger.Module;
import dagger.Provides;

@Module
public class PersonModule {
	
    // 이름을 제공한다.
    @Provides
    String provideName(){
        return "hik";
    }
    
    // 나이을 제공한다.
    @Provides
    int provideAge(){
        return 100;
    }
}

Component Interface

import dagger.Component;

@Component(modules = PersonModule.class) // 사람모듈에서 제공받음
public interface PersonComponent {

   Person getPerson(); // Person class에 제공함

}

 

Person Class


import javax.inject.Inject;

public class Person {

    private String name;
    private int age;

    public Person(){

    }

    // 생성자에 주입 받을것 지정.
    @Inject
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

 

Test 해보기

- 안드로이드 프로젝트 생성시 기본적으로 생성되는 ExampleUintTest에서 해보기

    @Test
    public void testPersonInjection(){
        PersonComponent component = DaggerPersonComponent.create();
        Person person= component.getPerson();
        System.out.println(person.getName()+","+person.getAge());
    }

실행결과

모듈에서 보낸 이름과 나이를 생성자에 주입시켜서 Person 객체를 생성한것을 확인 할 수 있다.

지금 한 예제는 매우 간단한 예제고 다음 포스팅부터는 각 핵심 개념을 좀더 자세히 학습후 정리한다.

'DI > Dagger2' 카테고리의 다른 글

Android app에서 Dagger 사용  (0) 2021.05.03
Dagger Basic  (0) 2020.11.30
수동 종속성 삽입  (0) 2020.11.30
Android의 종속 항목 삽입  (0) 2020.11.24
의존성 주입이란?  (0) 2020.08.04