DI (Dependency Injection 의존성 주입)이란?
Object Dependencies(객체 의존성)
한 객체가 다른 객체와 상호작용(참조)하고 있다면 그 객체는 다른 객체에 의존성을 가집니다.
class Aclass {
let name = "a"
}
class Bclass {
let aClass = Aclass()
}
- 위 코드에서 Bclass는 Aclass 객체에 의존합니다.
- Aclass 객체가 수정되면 Bclass도 같이 변경되게 됩니다. 즉, 하나의 모듈이 바뀌면 의존한 다른 모듈까지 변경되어야 합니다.
Dependency Injection(의존성 주입)
외부에서 객체를 생성하여 넣어주는 것입니다. 클래스 생성, 함수를 통해 넣는 등 외부에서 객체를 주입해줍니다.
class Aclass {
let name = "a"
}
class Bclass {
let aClass: Aclass
init(with externalVariable: Aclass) {
self.aClass = externalVariable
}
}
let b = Bclass(with: Aclass())
- 위와 같이 필요한(의존하는) 클래스를 직접 생성하는 것이 아닌, 주입해줌으로써 객체 간의 결합도를 줄이고 좀 더 유연한 코드를 작성할 수 있게됩니다.
- 한 클래스를 수정하였을 때, 다른 클래스도 수정해야 하는 상황을 막아줄 수 있습니다.
Dependency Inversion(의존관계 역전, Inversion Of Control)
단순히 객체를 주입하는 것이 아닌 의존관계 역전을 통해 의존성을 분리합니다.
상위계층이 하위계층에 의존하게 되는 상황을 반전시켜서 하위 계층의 구현으로부터 독립하게 됩니다. 결론적으로 구체적인 클래스보다 Interface(Protocol)을 통해 의존관계를 맺도록 설계해야합니다. 제어의 주체가 Interface(Protocol)에게 있습니다.
protocol DIP: AnyObject {
var name: String { get set }
}
class Aclass: DIP {
var name = "a"
}
class Bclass {
let aClass: DIP
init(with externalVariable: DIP) {
self.aClass = externalVariable
}
}
let b = Bclass(with: Aclass())
의존성 주입의 장점
- 재사용성을 높여줍니다.
- 객체간의 의존관계를 없애거나 줄일 수 있기 때문에 테스트에 용이합니다.
- 코드도 단순화 시켜줍니다.
- 종속적이던 코드를 줄여줍니다. 구성 요소의 종속성이 감소하면, 변경에 민감하지 않습니다.
출처 및 참고
- https://medium.com/@jang.wangsu/di-dependency-injection-%EC%9D%B4%EB%9E%80-1b12fdefec4f
- https://velog.io/@wlsdud2194/what-is-di
- https://gmlwjd9405.github.io/2018/11/09/dependency-injection.html
Author And Source
이 문제에 관하여(DI (Dependency Injection 의존성 주입)이란?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@rnfxl92/DI-Dependency-Injection-의존성-주입이란저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)