android

Android DI

Seon Dev Notes 2025. 2. 9. 21:52

오늘은 안드로이드 앱 개발에서 많이 사용되는 DI(Dependency Injection)에 대해서 알아보겠다.

DI

클래스 또는 객체가 필요로 하는 의존성(Dependency)을 직접 생성하거나 관리하는 대신, 외부로부터 제공받는 디자인 패턴이다.

  • DI의 핵심은 의존성을 주입받는다는 것이다. 객체가 스스로 의존성을 만들거나 찾지 않고, 외부에서 제공받는다.
  • DI는 SOLID 원칙 중 D (Dependency Inversion Principle, 의존성 역전 원칙) 를 따르는 디자인 패턴이다.

DI 사용 장점

  • 코드의 재사용 및 의존성 분리 -> 클래스 간의 결합도를 줄임
  • 리팩토링이 수월함
  • 테스트 편의성 -> 클래스가 의존성을 관리하지 않으므로 테스트를 더 쉽게 수행할 수 있음

Android Di 실행 방법

  1. Constructor Injection(생성자 주입) -> 가장 권장되는 방법
  2. Field Injection(필드 주입)
  3. Method Injection(메소드 주입)

예제

class Car(private val engine: Engine) { // Car 클래스 정의, 생성자를 통해 Engine 객체를 주입받음
    fun start() { // Car 클래스의 start() 메서드 정의
        engine.start() // 주입받은 Engine 객체의 start() 메서드 호출
    }
}

fun main(args: Array<String>) { 
    val engine = Engine() // Engine 클래스의 객체 생성
    val car = Car(engine) // Car 클래스의 객체 생성, 생성자에 Engine 객체 주입
    car.start() // Car 객체의 start() 메서드 호출
}
// Constructor Injection(생성자 주입)

 

Car 클래스의 생성자를 통해 Engine 객체를 필수적으로 주입받는다.  Car 객체를 생성하려면 반드시 Engine 객체를 제공해야 한다.

class Car { 
    lateinit var engine: Engine // Engine 타입의 lateinit 변수 engine 선언

    fun start() { // start() 메서드 정의
        engine.start() // engine 객체의 start() 메서드 호출
    }
}

fun main(args: Array<String>) { 
    val car = Car() // Car 클래스의 객체 생성
    car.engine = Engine() // car 객체의 engine 변수에 Engine 객체 할당
    car.start() // car 객체의 start() 메서드 호출
} // Field Injection(필드 주입)
// DI 라이브러리를 사용하지 않아서 main 함수에서 직접 engine 필드에 Engine 인스턴스를 할당해야 한다.

Car 클래스 내부의 engine 필드에 main 함수에서 직접 값을 할당한다. Car 객체를 생성할 때는 Engine 객체가 필수로 필요하지는 않는다.

DI 라이브러리

  • Dagger/Hilt: 컴파일 시점에 의존성 그래프를 생성하여 런타임 성능이 우수하다. Hilt는 Dagger를 Android 환경에 맞춰 더 쉽게 사용할 수 있도록 Google에서 제공하는 라이브러리이다. Compose UI에서 Hilt를 사용하려면 hiltViewModel() 함수를 활용한다.
  • Koin: Kotlin으로 작성된 경량 DI 라이브러리로, DSL을 사용하여 의존성을 정의하고 주입한다.

'android' 카테고리의 다른 글

Android XML과 Compose의 차이점?  (0) 2025.02.23
Android Dagger & Hilt  (0) 2025.02.17
Android Coroutine(코루틴)  (0) 2025.02.03
Android Kotlin  (0) 2025.02.01
Android MVVM  (1) 2024.12.30