14. 안드로이드와 Dagger2 안드로이드를 위한 기본적인 접근 방식 안드로이드의 특성 하나의 애플리케이션 내에서 액티비티 또는 서비스 와 같은 생명 주기를 갖는 컴포넌트로 구성 프래그먼트는 단독 존재 불가하며 반드시 액티비티 내에 존재해야함 애플리케이션을 포함한 액티비티, 서비스 등 컴포넌트는 시스템에 의해서만 인스턴스화 된다. 위 특징을 통해 아래와 같은 컴포넌트 그래프를 그릴 수 있다. 앱은 생명주기 동안 다양한 화면(액티비티) 및 서비스가 생성과 소멸을 반복 하나의 액티비티 내에서는 여러 프래그먼트가 생성 소멸 반복 가능 앱 생명주기와 Dagger 컴포넌트의 생명 주기를 같이 하는 앱 컴포넌트 구현 액티비티나 서비스를 위한 컴포넌트는 앱 컴포넌트의 서브 컴포넌트로 구성한다 프래그먼트는 액티비티 ..
13. 컴포넌트 간의 의존 관계 다수의 컴포넌트를 생성 및 상호 의존 관계를 맺을 수도 있음 방법 서브 컴포넌트 컴포넌트 상속 서브 컴포넌트 서브 컴포넌트 내에 다른 서브컴포넌트 구현 두 컴포넌트를 연관 짓는 쉬운 방법 서브 컴포넌트는 상위 컴포넌트에 바인딩된 모든 의존성을 제공 받음 (그 반대는 불가) SubComponentB 는 SubComponentA, Component가 가진 모듈로 부터 의존성을 제공 받을 수 있음 SubComponentA 는 Component 모듈로 부터 의존성을 제공 받을 수 있음 Component 는 하위 컴포넌트 들이 가진 의존성을 제공 받을 수 없음 ❌ 서브 컴포넌트의 정의 추상 클래스 또는 인터페이스에 @Component 대신 @Subcomponent 어노테이션을 붙임..
12. 멀티 바인딩 하기 dagger의 멀티 바인딩을 사용하면 여러 모듈에 있는 같은 타입의 객체를 하나의 set, map 형태로 관리 가능 Set 멀티 바인딩 @IntoSet, @ElementsIntoSet -> @Provides 예제 코드 import dagger.Module import dagger.Provides import dagger.multibindings.ElementsIntoSet import dagger.multibindings.IntoSet @Module class SetModule { @Provides @IntoSet fun provideHello() = "Hello" @Provides @IntoSet fun provideWorld() = "World" @Provides @Eleme..
11. Dagger 바인딩의 종류 @Binds 모듈 내의 추상 메서드에 붙일 수 있음 추상 메서드 앞에 붙여 Binding을 위임 하는 annotation 반드시 하나의 매개 변수만을 가져야 함 매개 변수를 반환형으로 바인드할 수 있다. @Provides 메서드 대신 좀 더 효율적으로 사용할 수 있다. @Module abstract class MyModuleRandom{ @Binds abstract fun bindRandom(secureRandom: SecureRandom):Random } Random 객체를 SecureRandom 객체에 바인딩 @Binds는 객체를 생성하는 대신 Component 내에 있는 객체를 파라미터로 받아 바인딩하여 좀 더 효율적으로 동작하게 해줌 좀 더 자세한 예제 보러가기 ..
10. 범위 지정하기 각 컴포넌트에 @Scope 로 범위 지정 가능 하나의 인스턴스만 만들어서 참조하는 싱글턴 패턴과 비슷 컴포넌트의 인스턴스는 의존성의 제공 방법에 대한 동일 성을 보장 받을 수 있음 앱 생명주기와는 달리 별도로 생명 주기를 따로 관리 가능 example 안드로이드에서 애플리케이션, 엑티비티, 프래그먼트 인스턴스에 때한 범위 지정을 다르게 해서 관리하여 오브젝트 그래프의 생성과 소멸을 각자 관리 가능함 @Singleton 사용하기 @Singleton을 사용한 범위 지정 및 객체 재사용 @Singleton @Component(modules = [MyModule2::class]) interface MyComponent2{ fun getAny():Any } @Module class MyMod..
09. 한정자 지정하기 반환형으로 바인드된 객체를 식별하기 애매할 때 example: string 타입 2개를 반환 하는 경우 @Module class MyModuleEx{ @Provides fun provideHello() = "Hello" fun provideWorld() = "World" } string 형식 반환이 2개 있으므로 오류! 그러나 2개가 필요한 상황이 있을 수 있다. 이럴때는 javax.inject package 에서 @Named 어노테이션을 사용할 수 있다. import dagger.Component import dagger.Module import dagger.Provides import javax.inject.Inject import javax.inject.Named @Compo..
08. Lazy 주입과 Provider 주입 상황에 따른 의존성 주입 시점 늦추기 또는 새로운 객체 요청 Lazy Provider Lazy 주입 객체가 초기화되는 데 시간이 필요한 경우 바인드된 타입 T를 제네릭으로 갖는 Lazy를 만듦. get() 이불리기 전 까지는 초기화 되는것을 늦출 수 있음 import dagger.Component import dagger.Lazy import dagger.Module import dagger.Provides import javax.inject.Inject Lazy 를 dagger 말고 다른 Lazy 를 써서 삽질 좀 했네요. import 주의 합시다 cannot be provided without an @Provides-annotated method. 오류 해..
07. 컴포넌트 바인딩된 모듈로 부터 오브젝트 그래프를 생성하는 핵심적인 역할 @Component 사용 interface, abstract class 에만 붙일 수 있음 컴파일 타임에 'Dagger', @Component가 붙은 클래스 이름이 합쳐진 형식의 이름을 가짐 @Component가 갖는 속성 modules : 컴포넌트에 바인드되는 @Module 이 지정된 클래스 배열 모듈이 다른 모듈을 포함한 경우 해당 모듈까지 컴포넌트에 구현해야함 dependencies : 컴포넌트에 다른 컴포넌트의 의존성을 사용하는 경우 클래스 배열 오브젝트 크래프 Dagger에서는 컴포넌트, 모듈, 객체 등의 관계를 컨테이너 or (오브젝트)그래프 라고 함 [Hello World 예제의 그래프] 컴포넌트 매서드 @Comp..
06. 모듈 컴포넌트에 의존 성을 제공하는 역할 (@Module 이 붙은 클래스) 프로바이더 모듈 클래스 내 메서드에 @Provides 어노테이션을 붙여서 컴파일 타임에 의존성을 제공하는 바인드된 프로바이드를 만들 수 있다 반환 타입을 보게되는데 이때 컴포넌트 내에 중복되는 반환타입이 있으면 안된다. import dagger.Module import dagger.Provides @Module class MyModule { @Provides fun provideHelloWorld(): String = "Hello World" @Provides fun provideSSLee(): String = "Lee Sang Su" // error! } 또는 컴포넌트에 바인드된 메서드의 반환형은 @Provides 메서드..
3. Dagger2란 무엇인가? 자바와 안드로이드를 위한 강력하고 빠른 의존성 주입 프레임워크 특징 리플렉션을 사용하지 않음 (리플렉션 : 리플렉션은 구체적인 클래스 타입을 알지 못해도, 그 클래스의 메소드, 타입, 변수들을 접근할 수 있도록 해주는 자바 API) 런 타임에 바이트 코드도 생성하지 않음 컴파일 타임에 애노테이션 프로세서에 의해 의존성 주입과 관련된 모든 코드를 분석하고 자바 소스 코드를 생성 Dagger 전에는 자바 진영에서 Guice를 사용했는데 리플렉션을 사용 및 런 타임에 오브젝트 그래프를 구성하여 성능에 악영향을 끼치는 경우가 많았음 Guice와 비슷한 API를 가지며 더 빠른 Dagger1(2012) 이후 구글 코어 라이브러리 팀과 함께 Dagger2를 만들어 현재까지 발전 프로..