Hun's Blog

Android Dagger-Hilt 적용기 (1) - Dependency Injection 본문

Android

Android Dagger-Hilt 적용기 (1) - Dependency Injection

jhk-im 2020. 11. 6. 23:05

Dependency Injection ... 그리고 hilt 

Dependency Injection을 직역하면 의존성(종속성) 주입이다. 공식 문서에선 종속 항목이라고 하고 개인적으로 단어 자체가 너무 추상적이라 한번에 이해하기는 어려웠다. 기본적으로 DI로 줄여 말하며 아래의 링크에서 아주 기초적인 내용으로 DI에 대해서 잘 설명해주고 있다. 해당 내용을 바탕으로 DI에 대해서 개념을 정리하였다. 

*DI로 통일해서 사용하도록 하겠다. 

developer.android.com/training/dependency-injection

 

Android의 종속 항목 삽입  |  Android 개발자  |  Android Developers

종속 항목 삽입(DI)은 프로그래밍에 널리 사용되는 기법으로, Android 개발에 적합합니다. DI의 원칙을 따르면 훌륭한 앱 아키텍처를 위한 토대를 마련할 수 있습니다. 종속 항목 삽입을 구현하면

developer.android.com

DI란 무엇인가?

클래스에는 다른 클래스의 참조가 필요하다. 

class Phone {

    private val battery = Battery()

    fun start() {
        battery.start()
    }
}

fun main(args: Array) {
    val phone = Phone()
    phone.start()
}

위 처럼 Phone 클래스는 Battery에 대한 참조가 필요할 수 있고 여기서 Battery를 DI라고 한다. 위 코드의 특징은 다음과 같다. 

` 클래스 내부에 필요한 DI를 직접 생성하고 초기화한다. ` 

 

이것은 여러가지 문제점을 발생시키는데 아주아주 간략히 설명해보겠다. 

1. 해당 Phone은 battery 일체형이다. battery 교체시 phone을 분해해야한다. 

2. 출시전 테스트를 해야하는데 실제 판매될 battery를 사용해야한다. 

 

` 만약 일체형이 아니었다면 테스트용 battery를 사용하여 테스트해볼 수 있었을 것이다. `

DI를 주입하면 이를 구현할 수 있다.

class Phone(private val battery: Battery) {
    fun start() {
        battery.start()
    }
}

fun main(args: Array) {
    val battery = Battery()
    val phone = Phone(battery)
    phone.start()
}

 

위 코드의 장점

1. 다양한 배터리를 사용할 수 있다. 

2. 출시전 테스트를 위해 테스트용 배터리를 사용할 수 있다. 

3. 다양한 배터리에대한 여러가지 시나리오를 테스트할 수 있다. 

...

 

위 처럼 라이브러리를 사용하지 않고 DI를 직접 생성하고 관리하는 것을 수동 DI라 한다. 이제 해당 phone을 대량생산 한다고 생각해보자. 이때 수동 DI는 불필요한 반복작업이 될수 있으며 다음의 문제를 발생시킨다. 

1. 부품이 100가지로 늘어난다면 반복작업과 동시에 각각의 부품에 연결할 코드가 필요하다. 

2. 다중레이어 즉 Phone -> main board -> battery 인경우 위 코드는 메인보드를 생성할때 battery를 함께 생성해야만한다. 

 

여기서  DI를 생성하고 제공하는 프로세스를 자동화하여 위 문제를 해결하는 것이 Dagger 라이브러리이다. 

사실 DI구현을 위해 안드로이드에서 가장 대중적으로 사용된 라이브러리가 Dagger이다. 여기서 Dagger에 대한 경험이 부족한 것 같아서 고민이 되었으나 아래의 Hilt Example에서 Dagger와 함께 hilt가 있고 없을때의 차이를 조금이나마 쉽게 설명해주고 있어서 이해하고 적용할수는 있을것이라 판단하고 계속 진행하였다. 

 

codelabs.developers.google.com/codelabs/android-hilt/?hl=ko#0

 

Using Hilt in your Android app  |  Google Codelabs

In this codelab, you’ll build an Android app that uses Hilt to do Dependency Injection.

codelabs.developers.google.com

dagger hilt example

구현된 예제는 아래 개인 github에 올려두었다. 

https://github.com/jhk-im/android-samples/tree/daggerHilt