의존성 주입(DI)란?

클래스는 다른 클래스의 참조가 필요하다. 이때, 필요한 클래스를 의존성이라고 하며, 의존성의 인스턴스가 요구된다.

클래스가 필요한 객체를 얻는 방법에는 3가지가 있다.

  1. 클래스가 필요한 의존성을 생성하여 초기화한다.

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

    단점

  2. 다른 곳에서 객체를 가져온다. ( ex, Context getter, getSystemService() 와 같은 일부 안드로이드 API)

  3. 객체를 매개변수(클래스 구성시 or 필요한 함수)로 제공 받는다. → 의존성 주입

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

    장점

    Untitled


DI의 이점

DI 방법

  1. 생성자 삽입 : 클래스의 의존성을 생성자에 전달
  2. 필드 삽입(or setter 삽입) : Activity, Fragment와 같이 시스템에서 인스턴스화를 하는 경우 생성자 삽입이 불가능하다. 필드 삽입을 사용하면 의존성은 클래스가 생성된 후 인스턴스화된다.

수동 DI

위의 예제들처럼 의존성을 직접 생성, 제공 및 관리하는 방식을 직접 의존성 주입 또는 수동 의존성 주입이라고 한다.