Foundation/Android

[Android] 종속 항목 삽입(Dependency Injection)이란?

개발왕 금골드 2022. 11. 19. 19:01
반응형

Introduce

종속 항목 삽입을 구현하면 다음과 같은 이점을 누릴 수 있다.

  • 코드 재사용 가능
  • 리팩터링 편의성
  • 테스트 편의성

종속성 항목 삽입이란?

클래스에는 흔히 다른 클래스 참조가 필요하다. 예를 들어 Car 클래스는 Engine 클래스 참조가 필요할 수 있다. 이처럼 필요한 클래스를 종속 항목이라고 하며, 이 예에서 Car 클래스가 실행되기 위해서는 Engine 클래스의 인스턴스가 있어야 한다.

클래스가 필요한 객체를 얻는 세 가지 방법은 다음과 같다.

  1. 클래스가 필요한 종속 항목을 구성한다. 위의 예에서 Car는 자체 Engine인스턴스를 생성하여 초기화한다.
  2. 다른 곳에서 객체를 가져온다. Context Getter 및 getSystemService()와 같은 일부 Android API는 이러한 방식으로 작동한다.
  3. 객체를 매개변수로 제공받을 수도 있다. 앱은 클래스가 구성될 때 이러한 종속 항목을 제공하거나 각 종속 항목이 필요한 함수에 전달할 수 있다. 위의 예에서 Car 생성자는 Engine을 매개변수로 받는다.

세 번째 옵션이 종속 항목 삽입이다. 이 접근 방법을 사용하면 클래스 인스턴스가 자체적으로 종속 항목을 얻는 대신 클래스의 종속 항목을 받아서 제공한다.

Example

코드 내에서 차제 생성

class Car {

    private val engine = Engine()

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

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

  • 이 예에서 Car와 Engine은 밀접하게 연결되어 있다. 이 말 뜻은 한 가지 유형의 Engine 객체를 자체적으로 구현하였기 때문에 쉽게 변경하기 어렵다는 뜻이다. 예를 들어 Engine을 가솔린 엔진과 전기 엔진으로 변경하기 위해서는 두 개의 서로 다른 Car 객체를 생성해야 한다.
  • 강력한 의존은 테스트를 더욱 어렵게 만든다.

의존성 주입

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

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

  • Car의 재사용이 더욱 쉽다. 예를 들어, Engine을 상속받는 다양한 Engine 클래스를 선언하여 서로 다른 Engine을 사용하는 Car를 쉽게 생성할 수 있게 된다. 단순히 새로운 엔진을 상속받는 클래스를 전달하기만 하면 되기 때문이다.
  • 위와 같은 이유로 FakeEngine() 같은 dummy 클래스를 생성하여 전달하면 테스트가 용이하다.

Android에서 종속 삽입

  • 생성자 삽입. 위에서 설명한 방법. 즉, 클래스의 종속 항목을 생성자에 전달한다.
  • 필드 삽입(또는 setter 삽입). Activity 및 Fragment와 같은 특정 Android 프레임워크 클래스는 시스템에서 인스턴스화하므로 생성자 삽입이 불가능하다. 필드 삽입을 사용하면 종속 항목은 클래스가 생성된 후 인스턴스화 된다.
class Car {
    lateinit var engine: Engine

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

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

종속 자동 삽입

  • 이전 예에서는 라이브러리를 사용하지 않고 다양한 클래스의 종속 항목을 직접 생성, 제공 및 관리하는 경우이다.
  • 다만, 대규모 앱의 경우 위 예시보다 더욱 많은 코드를 필요로 하기 마련이다. 예를 들어, Car의 Engine만 필요한 것이 아니라, 타이어를 비롯해 수많은 부품들이 필요하기 마련이다.
  • 또한, 항상 부품들이 미리 준비되어 있어서 바로바로 전달해 줄 수 있다는 보장도 없다.
  • 종속 항목을 생성하고 제공하는 프로세스를 자동화하여 이 문제를 해결하는 라이브러리로써 Android에서는 Hilt를 사용할 수 있다.
  • Hilt는 Dagger기반으로 만들어진 라이브러리이며, Dagger는 종속 항목 그래프를 자동으로 생성하고 관리하여 앱에서의 DI 사용을 용이하게 한다.

 

참고자료

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

 

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

Android의 종속 항목 삽입 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 종속 항목 삽입(DI)은 프로그래밍에 널리 사용되는 기법으로, Android 개발에 적합합니

developer.android.com

 

반응형