본문 바로가기
프로그래밍/Android

(Android) Dagger2

by LiveData 2018. 12. 21.
반응형

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을 사용해서 구성.
@ContributesAndroidInjector(modules = LoginModule.class)
abstract LoginActivity loginActivity();
cs

@Singleton
@Component(modules = {
        AppModule.class,
        ActivityBindingModule.class})
public interface AppComponent
cs


반응형