Google Architecture 중 하나인 Dagger2입니다.
제가 생각하기에 Google Architecture 중 제일 어려운 개념+사용 같습니다..
(저만 그럴 수도 있어요..)
2일을 투자했지만 아직도 개념+대충 코드만 볼 수있을 정도입니다.
제가 봤던 것 중 제일 괜찮았던 dagger2에 대한 참조를 포스팅합니다.
영문
- 제일 괜찮았던 dagger2에 대한 영문 사용법 이었습니다.
왜 썻는지 하나하나 알려주기 때문에 처음 보는 분들에게 유용하게 다가왔습니다.
but, 현재 dagger2의 기존 사용 문법이 바뀐 것이 있습니다.
한글
- 제가 제일 처음 봤던 Dagger2 사용법입니다.
기초 개념을 한글을 통해 쉽게 잡을 수 있습니다.
but, 스킵 되는 개념들이 몇가지 있어 깊이 이해하기는 힘듭니다.
6/26일 상황)
개념 자체는 간단해 보이지만 사용법이 너무 친절하지가 않다.
일단 module, component, inject의 개념은 쉽지만 여기서
subcomponent, scope, binds 등 여러 annotation이 겹치면서 이해를 어렵게 한다.
내 이해를 더욱 더 더디게 만드는 원인은!
Dagger1-> Dagger2 와 Dagger2자체 업그레이드 되면서
기존 사용하던 패턴?들이 간단하게 스킵,변형 되어 사용됩니다.
- ex) application에서 build() 하던 것이 create()로 간단하게 바뀜.
그래서 설명과 실제 git 예제 코드가 다름.
현재) 코드를 보면 이해하지만, 직접 해보라고하면 못할 정도.
계속 연구+내것으로 만들기를 진행 중
6/27)
@scope : sington과 비슷하게 사용되는 annotation으로 개체의 단일 인스턴스를 유지
sington과 다른 점은 전체 application이 아닌 구성요소의 lifecycle(수명주기)와 관련되어 있다.
@Qualifier : 같은 return값을 가질 때 구별하기 위한 annotation
예) 같은 값을 return 하는 경우 @other1 @other2 로 구분
이때 inject 할때도 @other1 @other2를 붙혀서 둘을 구분시켜 inject 할 수 있다.
@Singleton : 선언 시 singleton이 되며 아무곳에서 inject할 수 있다.
6/29)
@IntroMap : 선언한 곳에 Map의 key와 value형식으로 지정한다.
@Documented
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@MapKey
public @interface ViewModelKey {
Class<? extends ViewModel> value();
}
@Binds
@IntoMap
@ViewModelKey(MovieListViewModel.class)
abstract ViewModel bindMovieListViewModel(MovieListViewModel movieListViewModel);
|
cs |
ViewModelKey는 Scope로써 class명의 값을 받습니다.
즉, 받은 값은 Map의 key가 됩니다. 그리고 movieListViewModel이 value가 됩니다.
** movieListViewModel이 value가 되는 이유
원래 movieListViewModel이 return됬는데 @Binds로 인해 abstract로 축약표현
Parameter가 Provide로 사용됩니다.
@binds 와 @ContributesAndroidInjector
@binds : @Provides를 대체할 수 있는 것으로 매개변수를 바로 return 한다.
@Provides 사용
@Provides
public LoginContract.Presenter
provideLoginPresenter(LoginPresenter loginPresenter) {
return loginPresenter;
}
|
cs |
@binds 사용
@Binds
public abstract LoginContract.Presenter
provideLoginPresenter(LoginPresenter loginPresenter);
|
cs |
- 결론 : 코드를 짧게 쓸 수 있다.
@contributesAndroidInjector : Activity, Fragments, Services 등에 대해 별도의 하위 구성요소를 만들어 DispatchingAndroidInject의 injectorFactories에 추가하는것
@Module을 사용해서
@Module
public abstract class LoginModule {
@Binds
public abstract LoginContract.Presenter
provideLoginPresenter(LoginPresenter loginPresenter);
}
|
cs |
@ContributesAndroidInjector(modules = LoginModule.class)
abstract LoginActivity loginActivity();
|
cs |
@Singleton
@Component(modules = {
AppModule.class,
ActivityBindingModule.class})
public interface AppComponent
|
cs |
'프로그래밍 > Android' 카테고리의 다른 글
Cordova 설치 및 환경설정 하기 (0) | 2019.06.08 |
---|---|
(Android) Glide - 안드로이드 이미지 로드 라이브러리 (0) | 2018.12.21 |
(Android) ActivityContext? ApplicationContext? (0) | 2018.12.21 |
(Android) Room Persistence Library 실습 -1 (0) | 2018.12.21 |
(Android) Room Persistence Library(Room Database) (0) | 2018.12.21 |