Dependency Injection in Swift

Lena·2021년 7월 21일
1

Dependency Injection, DI

Dependency

의존성이란 하나의 객체가 다른 객체에 강하게 결합(coupling)되어 있는 것을 의미한다.
다음 예제에서 Vehicle class의 init 안에서 RaceCarEngine class를 생성하고 있기 때문에,
Vehicle class는 RaceCarEngine class와 강하게 결합하고 있는 구조이다.

class Vehicle
{
    var engine: Propulsion

    init() {
        engine = RaceCarEngine()
    }

    func forward() {
        engine.move()
    }
}

Dependency Injection

이렇게 객체 간 강하게 결합되어 있는 구조는 모듈화 되지 않으므로, 코드의 유지보수에 좋지 않다.
결합도를 낮출 수 있게 개선해보면 다음과 같다:

class Vehicle
{
    var engine: Propulsion

    init(engine: Propulsion) {
        self.engine = engine
    }

    func forward() {
        engine.move()
    }
}

init 안에서 파라미터로 Propulsion 타입을 주입(Injection)받음으로써, Vehicle class가 더 이상 RaceCarEngine class를 알지 않도록 바뀌었다!

이제, 아래와 같이 Vehicle class의 engine으로 RaceCarEngine 외에 다른 class를 주입할 수 있게 되었다:

let rocket = RocketEngine()

var car = Vehicle(engine: rocket)
car.forward()

이처럼 Protocolinit을 이용해 의존성을 주입하게 되면...

  • (when rocket engine class isn’t ready yet) 테스트 목적으로 fake class를 만들어 사용할 수 있고,
  • 객체 간 결합도가 낮아졌으므로, Protocol을 따르는 어떤 class든 주입할 수 있다(unit testing).

의존성 주입을 위해 반드시 Protocol을 사용해야 하는 것은 아니다.
subclassing이나, generic, opaque type을 활용할 수도 있다.

정리하면🙂

  • 의존성 주입은 객체 간 강한 결합(coupling)을 피하기 위해 사용한다.
  • 의존성을 주입함으로써 unit test가 용이해진다.

0개의 댓글