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를 만들어 현재까지 발전 프로..
1. 의존성 주입이란? 의존성 주입(DI, Dependency Injection) 하나의 객체의 다른 객체의 의존성을 제공하는 기술 의존성과 주입 의존성 : 객체 지향에서 두 클래스 간의 관계, 일반적으로 둘중 하나가 다른 하나를 필요로함 class CPU class Computer { private val cpu: CPU init { cpu = CPU() } } 위 코드를 보면 컴퓨터를 생성할 떄 CPU가 강하게 결합한다. 다른 CPU로 변경이 불가능 -> 'Computer가 CPU에 의존성을 갖는다' 주입 : 생성자나 메서드를 통해 외부로 부터 생성자 객체를 전달 받는 것 class CPU class Computer { private var cpu: CPU? = null fun setCPU(cpu: ..
7. 안드로이드 애플리케이션 설계 패턴 (MVC, MVP, MVVM) 일반적인 MVC, MVP, MVVM 디자인 패턴 7.1. MVC 디자인 패턴 Model, View, Controller 로 관심사 분리 안드로이드 플랫폼 등장 초기에 자연스럽게 적용되기 시작 모델의 역할 애플리케이션의 비즈니스 로직, 사용 되는 데이터를 다룸 표현 형식에 의존적이지 않고, 사용자에게 보이지 않아 어떻게 보일지 신경쓰지 않아도됨 비즈니스 데이터 = DBMS에 의해서 관리 몇 함수를 통해서 데이터를 제공, 입력, 수정 안드로이드에서 데이터베이스의 Entity 를 담당하는 POJO 클래스를 포함한 SQLite, Room, Realm 등 [POJO 클래스 예시] data class Employee( var name: Stri..