일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 추상 팩토리
- 프로토타입 패턴
- El
- F
- Kotlin
- 안드로이드 디자인시스템
- 코틀린
- Abstract Factory
- r
- 함수형프로그래밍
- ㅓ
- factory method
- PrototypePattern
- android designsystem
- material3
- Functional Programming
- 싱글톤
- Design Pattern
- Singleton
- 디자인패턴
- ㅋㅁ
- Observer Pattern
- compose
- 디자인패턴 #
- builderPattern
- 빌터패턴
- 옵저버 패턴
- designPattern
- 팩토리 메소드
- 추상팩토리패턴
- Today
- Total
오늘도 더 나은 코드를 작성하였습니까?
Dagger2 (안드로이드 의존성 주입 프레임워크)란? 본문
Dagger2란?
- 자바와 안드로이드를 위한 의존성 주입 프레임워크다.
- 리플렉션을 사용하지 않는다.
- 런 타임 시에 바이트 코드도 생성하지 않는다.
- 컴파일 타임에 Annotation 프로세서의 의해 의존성 주입과 관련된 코드를 이용해 코드를 생성한다.
장점
- 자원공유의 단순화 및 지정된 범위의 생명주기 내에서 동일한 Instance를 제공한다.
- 복잡한 의존성을 단순하게 설정할 수 있다.
- 유닛 테스트를 쉽게 할 수 있다.
- 자동 코드 생성을 통해 디버깅이 가능하다.
핵심 개념
@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 |