Dependency Injection, DI
의존성이란 하나의 객체가 다른 객체에 강하게 결합(coupling)되어 있는 것을 의미한다.
다음 예제에서 Vehicle
class의 init 안에서 RaceCarEngine
class를 생성하고 있기 때문에,
Vehicle
class는 RaceCarEngine
class와 강하게 결합하고 있는 구조이다.
class Vehicle
{
var engine: Propulsion
init() {
engine = RaceCarEngine()
}
func forward() {
engine.move()
}
}
이렇게 객체 간 강하게 결합되어 있는 구조는 모듈화 되지 않으므로, 코드의 유지보수에 좋지 않다.
결합도를 낮출 수 있게 개선해보면 다음과 같다:
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()
이처럼 Protocol과 init을 이용해 의존성을 주입하게 되면...
의존성 주입을 위해 반드시 Protocol을 사용해야 하는 것은 아니다.
subclassing이나, generic, opaque type을 활용할 수도 있다.
정리하면🙂
- 의존성 주입은 객체 간 강한 결합(coupling)을 피하기 위해 사용한다.
- 의존성을 주입함으로써 unit test가 용이해진다.