의존성 주입 - Dagger 기초 예제
2020. 8. 17. 18:14ㆍAndroid
Dagger를 처음 접했을 때, 너무 많은 용어가 혼재되어있어 도무지 감을 잡기가 어려웠다.
가장 기초가 되면서 중요한 용어를 두가지만 꼽자면, 바로 Component와 Module을 꼽을 수 있다.
- Module은 Component에 연결되어 의존성 객체를 생성한다.
- 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());
}
}
소스코드 출처 | 아키텍처를 알아야 앱 개발이 보인다, 옥수환 저
'Android' 카테고리의 다른 글
[Androidx / Jetpack] ViewModel 개요 및 사용법 (0) | 2020.08.30 |
---|---|
[Androidx / Jetpack] LiveData 개요 및 사용법 (0) | 2020.08.30 |
의존성 주입 - Dagger, 모듈과 컴포넌트 (0) | 2020.08.17 |
2. 안드로이드 어플리케이션 설계(2) (0) | 2020.08.14 |
1. 안드로이드 어플리케이션 설계(1) (0) | 2020.08.14 |