[Android] 의존성 주입(DI)이란?

yuuuzzzinzzzang·2024년 3월 12일
1
post-thumbnail

💉 의존성 주입이란?

의존성: 어떤 대상이 참조하는 객체(또는 함수)
의존성 주입: 대상 객체(Client)에 의존성을 제공하는 기술

  • 의존성 주입 전
class Car {
   val engine = Engine()
}
  • 의존성 주입 후
class Car(val engine: Engine) {
   ...
}
fun main() {
   val gasolineCar = Car(GasolineEngine())
   val electricCar = Car(ElectricEngine())
}

→ 의존성 주입을 통해 Car 클래스의 소스 코드를 변경하지 않고도 각각 다른 Car 클래스 객체들(가솔린차, 디젤차, 전기차 등..)을 만들 수 있다.

→ Car와 Engine 클래스 간 결합도를 느슨하게 만들어 준다.

💉 Injector

의존성을 클라이언트에게 제공하는 역할

// 인젝터에서 하나의 엔진 인스턴스를 생성해 놓는다.
class Injector {
   val engine = Engine()
}

// 인젝터에서 생성한 엔진의 의존성을 주입받아 사용하면
// 동일한 Engine 인스턴스를 참조해 자원 공유가 가능하다.
fun main() {
   val injector = Injector()
   
   val engineA = injector.engine
   val engineB = injector.engine
   
   val carA = Car(engineA)
   val carB = car(engineB)
}

즉, 의존성 주입으로 얻을 수 있는 이점은?

✅ 역할 분리를 통한 보일러플레이트 감소

  • 클래스 자신의 역할만 책임지고 행할 수 있다.
  • ex) Car 클래스는 엔진을 통한 차 자체의 동작에만 책임지면 되지 부속품(엔진, 바퀴 등..)의 생성까지 신경 쓸 필요가 없다.
class Car(
   // 각각의 객체의 역할 분리를 통한 단일 책임 원칙 준수
   val engine: Engine,
   val wheels: Wheels,
   val wiper: Wiper,
) {
   // 의존성 주입을 통한 소스 코드 감소
}

✅ 결합도를 낮추고 재사용성이 높아진다

  • 결합도가 느슨해져 소스코드 변경 없이 재사용이 가능하다.
  • ex) Engine의 유형이 추가되어도 생성해서 전달만 하면 되기 때문에 각 유형에 맞게 코드를 변경할 필요가 없다.

✅ 테스트에 용이

  • 케이스별로 성공, 실패 유형에 따라 나눌 수 있는 다양한 테스트를 위한 FakeEngine도 생성해 주입할 수 있기 때문에 테스트에 용이해진다.
class CarTest {

   @Text
   fun `성공 케이스`() {
      val goodCar = Car(FakeGoodEngine())
      ...
   }
   
   @Text
   fun `실패 케이스`() {
      val badCar = Car(FakeBadEngine())
      ...
   }
}

✅ 의존성 관리가 편해진다

  • Injector와 같은 개념을 통해 의존성을 쉽게 관리하고 자원을 공유해 재사용할 수 있다.
profile
yuuuzzzin의 개발 블로그

0개의 댓글