의존성 주입 - Dagger 기초 예제

2020. 8. 17. 18:14Android

Dagger를 처음 접했을 때, 너무 많은 용어가 혼재되어있어 도무지 감을 잡기가 어려웠다.

가장 기초가 되면서 중요한 용어를 두가지만 꼽자면, 바로 Component와 Module을 꼽을 수 있다.

  1. Module은 Component에 연결되어 의존성 객체를 생성한다.
  2. Component는 연결된 Module을 이용하여 의존성 객체를 생성하고, 요청받은 인스턴스에 생성한 객체를 주입한다.

그럼 MyModule이라는 것을 먼저 만들어서 MyComponent에 특정 String(여기선 "Hello World : 의존성 주입 성공!")을 주입해 보도록 하자.

직접 해보기

app/build.gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 29

    // Dagger 이용시 에러메세지 확인을 용이하게 하기 위함
    gradle.projectsEvaluated {
        tasks.withType(JavaCompile) {
            options.compilerArgs << "-Xmaxerrs" << "500"
        }
    }

    ...
}

dependencies {
    implementation fileTree(dir: "libs", include: ["*.jar"])
    ...

    // Dagger 이용을 위해 추가
    implementation 'com.google.dagger:dagger-android:2.27'
    implementation 'com.google.dagger:dagger-android-support:2.27'
    annotationProcessor 'com.google.dagger:dagger-android-processor:2.27'
    annotationProcessor 'com.google.dagger:dagger-compiler:2.27'

    ...

}

MyModule.java

package kr.hcjung;

import dagger.Module;
import dagger.Provides;

@Module // 의존성을 제공하는 클래스에 붙임
public class MyModule {
    @Provides // 의존성을 제공하는 메서드에 붙임
    String provideHelloWorld(){
        return "Hello World : 의존성 주입 성공!";
    }
}

MyComponent.java

package kr.hcjung;

import dagger.Component;

//MyComponent 인터페이스 내에는 제공할 의존성들을 메서드로 정의해아 함

//@Component 에 참조된 모듈 클래스로부터 의존성을 제공받음
//여기서는 (modules = MyModule.class)
@Component(modules = MyModule.class)

//Component 메서드의 반환형을 보고 모듈과 관계를 맺으므로,
//바인드된 모듈로부터 해당 반환형을 갖는 메서드를 찾지 못하면 컴파일 타임 에러 발생
//여기서는 MyModule 의 String provideHelloWorld() 함수의 return "Hello World"; 에서 String 반환형을 찾음
public interface MyComponent {
    String getString(); //프로비전 메서드, 바인드된 모듈로부터 의존성을 제공
}

MainActivity.java

package kr.hcjung;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        MyComponent myComponent = DaggerMyComponent.create();
        TextView tv1 = findViewById(R.id.tv1);
        tv1.setText(myComponent.getString());

    }
}

 

소스코드 출처 | 아키텍처를 알아야 앱 개발이 보인다, 옥수환 저