본문 바로가기

ANDROID/DI

[Dagger2] 헷갈리는 DI 어노테이션 및 개념 정리

이미지 출처 : http://mahmoudramadan.me/getting-started-to-dagger-2-with-kotlin-for-android-app-development/

 

Dagger2를 사용한 DI를 반영하는 중에 헷갈리고 어려움을 겪는 부분을 최소하 하고자 내용을 좀 정리해두기로 했다.

 

어노테이션들에 대한 이해와 컴포넌트와 모듈간의 의존성 주입이 어떻게 이루어지는지가 이해되어야 원하는대로 의존성 주입을 수행함은 물론 컴파일 에러 지옥에서 빠져나올 수 있을 것이다.

 

0. 기본개념

Dagger2는 의존성 주입을 위해 개발된 라이브러리이다. 높은 러닝 커브를 자랑하지만, Hilt나 Koin에 앞서 광범위하게 사용되고 있는 DI 라이브러리로 알고 있다.

 

작동하기 위한 핵심 요소들만 살펴보면 의존성 주입을 위해서는 아래 요소가 구성되어야 한다.

 

제공하고자 하는 객체와 메소드 > 객체와 메소드의 의존성을 제공하는 모듈 > 모듈이 제공하는 의존성을 프로젝트에 제공하는 컴포넌트

 

이들은 컨테이너 혹은 오브젝트 그래프라 불린다.

 

1. 모듈

@Module

- Component에 클래스 의존성을 제공한다.

 

@Provides

- 모듈 내에서 메소드 의존성을 제공한다.

- 동일 모듈에서 같은 클래스 형을 가질 수 없다.(컴파일 에러)

- 같은 클래스 형을 가진 메소드를 사용하고자 한다면 @Named 어노테이션으로 구분한다.(@Named(name = "string_one") .. )

 

@Binds

- 모듈 내의 추상 메소드에 붙인다.

- 메소드의 매개 변수를 반환형으로 바인드한다.

- 반드시 하나의 매개 변수만을 가져야 한다. 

 

@BindsOptionalOf

- 모듈 내의 추상 메소드에 붙인다.

- 메소드의 매개 변수를 반환형으로 바인드한다.

- 매개 변수를 가질 수 없다.

 

@IntoSet

- 멀티 바인딩

- 여러 모듈에 있는 같은 타입의 객체를 Set에 추가한다.

- Provides와 함께 사용

 

@ElementsIntoSet

- 멀티 바인딩

- 타입의 Set List를 한번에 추가한다.

- Provides와 함께 사용

 

@IntoMap

- 멀티 바인딩

- Map의 형태로 객체를 바인딩한다.

 

@StringKey, @ClassKey, @IntKey, @LongKey

- IntoMap과 함께 사용.

- 어노테이션에 넘겨준 파라미터로 Key Value Map을 provide.

 

@MapKey

- 사용자 정의 키 생성

- interface에 @MapKey 어노테이션 붙여 사용

 

@Multibinds

- 추상적 멀티바인딩에 사용

- 반환형이 Map 혹은 Set이어야 사용 가능(예 : abstract fun strings() :Set<String>)

2. 컴포넌트

@Component

- 상속하고자 하는 모듈을 추가해 컴포넌트로 만드는 annotation

 

@Component.Builder

- Builder를 명시해 원하는 형태로 작성 가능

- 추가하지 않는 경우 Dagger가 자동으로 모듈의 의존성을 참조해 빌더를 자동으로 생성

 

@BindsInstance

- Component Builder 내의 Instance 바인딩에 사용한다.

 

 

이후 추가할 내용이 있으면 추가 예정!

 

< 참조 >

 

아키텍처를 알아야 앱 개발이 보인다

설계부터 유지 보수까지 튼튼하고 유연한안드로이드 애플리케이션 만들기안드로이드 앱 시장이 성숙하고, 서비스가 고도화됨에 따라 앱 설계에 대한 중요성이 강조되고 있다. 안드로이드 앱 ��

book.naver.com