일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- convert Intent to string
- Dagger2란
- Service 팁
- HashMap vs ArrayMap
- gitignore
- ArrayMap
- 음량표준화
- mitmproxy
- print callstack
- APK로딩
- 네트워크 디버깅
- 오픈소스라이선스
- APK 동적로딩
- so파일 동적로딩
- enum performance
- android enum
- java callstack
- BlockingQueue Capacity
- gitignore작성법
- Intent String 변환
- Replaygain
- callstack 출력
- lufs
- RxJava Programming
- Service관리
- corePoolSize
- android network
- MediaDataSource
- RxJava 스터디
- convert string to intent
- Today
- Total
일상&개발 로그
Dagger2 리서치 & 예제 본문
Dagger2란?
Dagger is a fully static, compile-time dependency injection framework for both Java and Android. "정적으로 Compile time에 의존성주입을 해주는 framework."
History
Dagger1은 Guice에서 영감을 받아 Square사 에서 만듦. Dagger2는 구글에서 Dagger1을 이어받아 만듦. AutoValue프로젝트에 영감을 받음. 17/01/16 현재 최신버전은 2.8
Dagger1과 Dagger2의 비교
Dagger1의 경우 Reflection을 이용해서 Graph를 합성하기 때문에 런타임에 비효율이 발생 & 디버깅이 어려움. Dagger2는 Reflection을 전혀 사용하지 않기 때문에 퍼포먼스 손실이 많지 않고 디버깅이 용이함. (구글에 따르면 Dagger1에 비해 13%의 성능 향상) Dagger1과 달리 Dagger2는 코드 난독화를 지원함.
의존성 주입이란?
의존성 주입에서 가장 중요한건 Inversion of Control 원리를 사용하는 것입니다. Inversion of Control 은 앱의 flow를 프로그램이 실행하는 동안 생성된 객체 그래프에 의존하게 합니다. 이와같은 동적인 flow는 추상화를 통해 가능해집니다. 이와같은 Runtime binding은 의존성 주입 또는 Service locator 방식으로 가능해집니다. JSR-330: Depenency Injection for Java로 표준 Annotation 정의임. Dagger에서 사용
Pros
의존성은 외부에서 주입되고 설정되기 때문에 구성요소들을 재사용 할 수 있음. 객체가 격리되어 있고 의존성이 없기 때문에 객체를 변경할 때 많은 코드의 변경이 필요 없고 객체를 instantiation 하는 부분만 변경해주면 됨. 구성요소에 의존성이 주입 될 수 있다는 의미는 Mock implementation의 주입도 가능하게 해 테스트하기 쉽게됨.
Cons
Dependency Injection은 일반적으로 단말 개발에서 많이 사용되지 않는 개념이기 때문에 learning curve가 다소 있음. Google에서 open source로 관리되는 라이브러리를 사용하기 때문에 버전이 올라갈 때 수정사항이 발생될 수 있음. Compile time이 길어질 수 있음.
예제
https://github.com/DoosikKim/dagger2-example
Annotations
- 의존성 주입 Annotations: 컴파일 시 Dagger가 생성한 코드에 의해 의존성이 주입
@Inject: 의존성 주입이 필요, Dagger에 의존성 요청
@Module: 의존성 제공 클래스
@Provide: @Module내부에서 @Inject에 주입할 객체를 생성
@Component: Injector, @Inject와 @Module사이의 연결고리 - Scope Annotations: 객체의 lifecycle 설정
@Scope: Custom Scope를 만들 때 사용
@Singleton: Pre-define된 Scope, Application Scope를 갖는다. - Qualifier Annotations: 같은 return타입을 가진 다른 객체를 구분할 때 사용
@Qualifier: Custom Qualifier를 만들 때 사용
@Named: Pre-define된 Qualifier, @Inject와 @Provides에 같은 이름을 붙여 구분한다.
References
1) https://google.github.io/dagger/users-guide.html
2) http://fernandocejas.com/2015/04/11/tasting-dagger-2-on-android/
3) https://medium.com/@jason_kim/tasting-dagger-2-on-android-%EB%B2%88%EC%97%AD-632e727a7998#.ks6z8t62j
4) https://github.com/codepath/android_guides/wiki/Dependency-Injection-with-Dagger-2
'개발 > 안드로이드 개발' 카테고리의 다른 글
AsyncTask 특징 (0) | 2017.04.24 |
---|---|
Intent를 String으로 변환하기 (0) | 2017.04.19 |
CallStack출력하기 (0) | 2017.02.08 |
so파일 동적로딩 시 arm-eabi관련해서 알아둘 것 (0) | 2017.02.08 |
TextView에 간편하게 Scroll 설정하는 방법 (0) | 2017.02.08 |