[Android] Dagger2 기초

Jay·2020년 12월 20일
0

Android

목록 보기
3/39
post-thumbnail

Dagger2의 필수 개념 5가지

Inject

  • 의존성 주입 요청.
  • inject로 주입 요청시, 연결된 component가 Module로부터 객체를 생성하여 넘겨줌.
  • inject 어노테이션을 di 진행할 변수와 생성자에 달아줌으로 di 확인 가능.

Component

  • 연결된 module을 이용하여 의존성 객체 생성.
  • inject로 요청받은 인스턴스에 생성한 객체를 전달(주입).
  • 의존성을 요청받고 전달하는 dagger의 주된 역할 수행
  • component 생성 시, interface나 abstract class에 @Subcomponent를 달아줘서 생성 가능.

Subcomponent

  • Component는 계층 관계 생성이 가능하다.
  • Subcomponent는 inner class방식의 하위계층 component이다.
  • 연속된 sub의 sub도 가능하다
  • Subcomponent는 Dagger의 중요 컨셉인 그래프 형성.
  • Subcomponent는 Component와 달리 코드 생성은 부모 component에서 이루어진다.
  • @Subcomponent에서 Builder, interface를 정의 되어야만 component에서 코드가 생성된다. 즉, @Subcomponent.Builder 어노테이션이 반드시 필요하다.
  • Subcomponent는 Component와 마찬가지로 Interface나 abstract class에 @Subcomponent를 달아줘서 생성이 가능하다.

Module

  • Component에 연결되어 의존성 객체 생성.
  • 생성 후 scope에 따라 관리

Scope

  • 생성된 객체의 lifecycle 범위.
  • 안드로이드에서 perActivity, perFragment 등으로 화면 생명주기와 맞춰 사용한다.
  • Module에서 객체의 Scope를 보고 관리한다.

Dagger Scope

  • Dagger의 Scope는 해당 클래스의 단일 인스턴스가 존재하는 범위를 말한다.
  • 흔히 알고 있는 싱글톤 패턴을 Application 전체가 아닌 범위를 지정해서 사용이 가능하다는 것.

Dagger2 does not allow unschoped components to use modules with scoped bindings. Unscoped components cannot have scoped dependencies.

Dagger2에선 서로 다른 Scope로 인해 문제 발생이 가능하기에 unscope Component는 Scope Module을 가질 수 없다.
즉, Application scope인 @Singleton @Provides를 이용하기 위해선 @Singleton @component를 이용해야 한다.


Dagger Injection

  • 생성자에 주입 -> 자주 쓰임
    - @Inject constructor(val a: A, val b:B) 형태로 생성자 주입
  • 멤버 변수에 주입 -> 종종 쓰임
    - @Inject 어노테이션을 사용하여 멤버변수를 lateinit var로 선언하고 주입
  • 함수의 param에 주입 -> 잘 안 쓰임
profile
developer

0개의 댓글