Dagger2에 대해 알아보자 !@!@
1. what is Dagger ?
Dagger는 의존성 주입 프레임워크이다.
- 의존성 주입은 클래스 간 의존성을 클래스 외부에서 주입하는 것
- 의존성의 인터페이스화를 통해 코드를 유연하게 하고, 클래스의 인스턴스를 외부에서 생성하는 것.
( 예를 들어 A클래스가 B클래스를 의존하는 경우 B object를 A클래스가 직접 생성하지 않고 외부에서 생성하여 넘겨주면 의존성을 주입한 것 )
2. 의존성과 주입의 뜻
- 의존성 : 함수에 필요한 클래스 또는 참조변수나 객체에 의존하는 것으로,의존성이 있다는 것은 클래스 간 영향을 받는다는 뜻이다. 인터페이스를 사용하여 클래스로부터의 의존성을 없애야 한다.
- 주입 : 주입은 클래스 외부에서 객체를 생성하여 해당 객체를 클래스 내부에 주입하는 것으로, 인스턴스를 저장하는 공간인 Container에서 필요한 각 클래스에 주입하는 것이다.
3. Dagger 요소
- (1). Conainer(Component) : 외부에서 클래스의 인스턴스를 생성하는 공간
- (2). Module : 클래스의 인스턴스를 모아두는 공간으로 (1)에게 의존성을 제공한다.
- (3). Provide : 인스턴스를 제공하는 역할, 주입부의 인스턴스를 제공하는 것
4. Inject
- 필드, 생성자(주 생성자), 메서드에 붙여 Component로 부터 의존성 객체를 주입 요청하는 annotation (난 이제 얘를 주입시킬거야 !!!!!!! 하고 티내는거임)
- @Inject로 의존성 주입을 요청하면 연결된 Component가 Module로부터 객체를 생성하여 넘겨준다.
- 객체의 생성이 클래스에서 이루어지지 않고, Component가 생성함
- @Inject할 때 변수는 private를 사용하지 않는다. 그 이유는 아래에서 확인
5. Module
- Component에 연결되어 의존성 객체를 생성하는 역할로, 생성 후 Scope에 따라 객체를 관리함
- @Module은 클래스에만 붙이고, @Provides는 반드시 @Module을 붙인 메서드에서만 사용
- @Module 클래스는 의존성 주입에 필요한 객체를 @Provide, @Binds 메서드를 통해 관리
(@Provide, @Binds 메서드의 파라미터 또한 Component에게 객체를 전달받고, 제공
6. Component
- @Component는 Interface, abstract class에만 사용 가능
- Dagger가 빌드시 @Component가 달린 인터페이스를 Dagger클래스로 자동으로 구현 (선언된 Component 앞에 Dagger만 붙여서 ex) CoffeeComponent -> DaggerCoffeeComponent)
- 최소 1개 이상의 abstract method(추상 메소드)가 포함(메소드를 통해 주입을 가능해짐)
- Component Method
* Provision Method : Provision은 인자가 없고, Module이 제공하는 객체의 타입을 반환형으로 갖는다.
* Member - Injection Method : 의존성을 주입시킬 객체를 메서드의 파라미터로 넘기는 방식으로,
Member-Injection 메서드를 호출하면 인자(매개변수)로 받은 타겟을 클래스 내부에 @Inject가 붙은 필드에
객체를 주입 (Module을 통해 의존성 주입) -> inject()함수는 Member-Injection Method 형태의 메서드임
* Component.Builder : Component 인스턴스를 생성하기 위한 Builder용 annoation, Module에 초기 설정을 할 때 사 용, interface or abstract class에 붙여 사용
7. SubComponent
- 부모 Component가 있는 자식 Component 이다.
- 그래프를 형성하는 역할, sub에서 먼저 의존성 검색을 하고 없으면 부모로 올라가며 검색한다.
- 코드 생성은 부모 Component에서 이루어짐
8. Scope
- 외부(Container)에서 제공하는 인스턴스들이 호출할 때마다 생성되어 불필요한 메모리 사용을 하기 때문에 적절한 Scope Annotation 사용을 해준다.
(1). @Singleton : 객체가 재사용되는 범위를 설정하기 위한 것, 동일한 인스턴스를 사용하고 해당 컴포넌트의 객체가 살아있으면 계속 같은 객체를 사용한다는 의미
(2). @CustomeScope : annotation class를 만들어 사용
(3). @Reusable : 새로운 인스턴스를 생성할 수 있지만, 이미 존재한다면 재사용한다. 항상 동일한 인스턴스를 사용하는 환경이 아니라면 @Singleton보다 유용
(4). @CanReleaseReferences : GC(Garbage Collection)이 발생했을 때, 해당 인스턴스를 해제할 수 있음
(5). @Qualifier : 타입만으로 의존성 식별을 하기 어려운 경우 사용
9. Dagger의 흐름
(1). @Inject 한다
(2). SubComponent ( SubModule -> @Provides, @Binds ) 자식 검사 , 없으면 부모 검사 Component ( Module -> @Provides, @Binds )
(3) - (2)에서 자식에 존재할 때 (Yes면 Return, No면 생성)
- (2)에서 부모에 존재할 때 (Yes면 Return, No면 생성)
=> 이 방식이 1. User Component 2. Activity Component 3. Application Component 순서대로 의존성을 검색함
10. 사용법
- build.gradle(Module)에 다음을 추가한다.
버전 확인
https://github.com/google/dagger/tags
'안드로이드 스튜디오' 카테고리의 다른 글
[안드로이드 스튜디오] Figma로 Layout 디자인하기 ! (1) | 2022.05.23 |
---|---|
[안드로이드 스튜디오] RxJava에 대해 알아보자 (0) | 2022.05.16 |
[안드로이드 스튜디오 코틀린] 쉬운 하단 바 네비게이션바 만들기 ( +자바 코드 추가) (8) | 2022.04.24 |
[안드로이드 스튜디오 코틀린] implementation 추가 하는 다양한 방법 (0) | 2022.04.17 |
[안드로이드 스튜디오 코틀린] viewBinding을 사용하는 이유, 사용법 (0) | 2022.04.12 |