본문 바로가기

안드로이드 스튜디오

[안드로이드 스튜디오] Dagger2는 무엇인가?

728x90
반응형

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를 사용하지 않는다. 그 이유는 아래에서 확인

https://stackoverflow.com/questions/16598123/android-dagger-dependency-injection-fails-on-private-fields

 

Android Dagger Dependency Injection fails on private Fields

I'm new to dagger (though I have experience with DI from working on Java EE WebApps using Weld). What I'm trying to do is to inject a dependency into a class. The field is private. Dagger then t...

stackoverflow.com

 

 

 

 

 

 

 

 

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

 

GitHub - google/dagger: A fast dependency injector for Android and Java.

A fast dependency injector for Android and Java. Contribute to google/dagger development by creating an account on GitHub.

github.com

 

728x90
반응형