📱 Android

DI (Dependency Injection) 의존성 주입

콩드로이드 2022. 12. 5. 21:03

코루틴으로 기존 프로그램 구조를 변경하다가, DI에 대해 다시 재정리가 필요할 것 같아서 재정리..합니다 


DI (Dependency Injection) 의존성 주입

직접 객체를 생성하지 않고, 외부로부터 주입받는 방법 (객체의 의존성을 주입)

왜 이런 개념을 사용해야하는지 알아보겠습니다 (공식문서 참조)

의존성을 주입하지 않는 예시(클래스에서 인스턴스를 직접 생성)

class Car {
    private val engine = Engine()
    
    fun start() {
        engine.start()
    }
}

fun main(args: Array) {
    val car = Car()
    car.start()
}

위 코드에서의 문제점은 

😱 Car, Engine이 너무 밀접하게 연결됨 (테스트가 어려움)

😱 Car에서 Engine을 구성하기 때문에 Gas, Electric Engine에 동일한 Car 클래스를 재사용하지 못하고 두 가지 유형의 Car 클래스를 생성해야합니다 -> 너무 비효율적..

 

 


📌  DI의 필요성

-  테스트의 용이성을 위해
-  Refactoring의 편의성 (코드 재사용성)을 위해

 

 

📌  Android에서의 DI 2가지 방법

 

1. 생성자 삽입 

class Car(private val engine: Engine) {
    fun start() {
        engine.start()
    }
}

fun main(args: Array) {
    val engine = Engine()
    val car = Car(engine)
    car.start()
}

class Car (private val engine: Engine) {...}

Car클래스에서 Engine 객체를 직접 생성하지 않고, Engine 객체를 생성자로 받고있습니다 

생성자로 주입받으면서 Car 클래스의 재사용성, Car 클래스의 테스트 용이성이 해결되었습니다 :)

 

Car클래스의 생성과 동시에 Engine을 생성하는 경우도 있지만, 그렇지 않은 경우엔 아래의 방법을 사용합니다

 

2. 필드 삽입(setter 삽입)

class Car {
    lateinit var engine: Engine

    fun start() {
        engine.start()
    }
}

fun main(args: Array) {
    val car = Car()
    car.engine = Engine()
    car.start()
}

클래스가 생성된 후에 Engine 객체를 생성합니다

 

지금 예제들은 간단하지만, 객체가 복잡해진다면 위와 같이 수동으로 작업하는 것이 굉장히 번거로울 수 있습니다

에러의 확률도 높아지구요 그래서 우린 보통 DI를 제공하는 라이브러리들을 사용합니다 🥹

 


 

DI 라이브러리

  Dagger Koin Hilt
사용 언어 Java, Kotlin Kotlin Java, Kotlin
단점 • 높은 러닝커브 리플렉션 사용
 의존관계 파악이 어려움
Runtime에서 에러검출

 낮은 점유율

장점 Compile 단계에서 에러검출 Compile 시간 단축
(별도의 Annotation 사용 x)
 낮은 러닝커브
 의존관계 파악이 쉬움
Dagger 기반
Compile에서 에러검출
일부 핵심 클래스에 DI

 

저는 Dagger만 사용을 해봤었는데, 이번에 프로젝트 구조를 변경하면서 Hilt를 도입해보기로 했습니다 

Hilt의 단점은 아직 낮은 점유율, 많은 앱에서 사용하지 않는다고 생각했었는데 

최근에 보니 Koin -> Hilt로 변경하는 사례들이 많은 것 같아요 

https://blog.banksalad.com/tech/migrate-from-koin-to-hilt/

 

뱅크샐러드 안드로이드 앱에서 Koin 걷어내고 Hilt로 마이그레이션하기 | 뱅크샐러드

blog.banksalad.com

 

 


저도 Hilt에 대해선 전혀 모르기 때문에 다음 포스팅부터는 본격적인 DI 돌입 전, 코드랩을 통해 Hilt를 먼저 공부해보겠습니다 :)

'📱 Android' 카테고리의 다른 글

[Android] SOLID 원칙  (0) 2023.01.08
[Hilt] 코드랩으로 Hilt 익히기 # 1  (0) 2023.01.07
[Android] Custom Spinner  (0) 2022.08.09
[Android] Custom Rating Bar  (0) 2022.08.04
[Android] RecyclerView - MultiViewHolder(2)  (0) 2022.07.13