의존성 관계 역전 원칙, DIP (Dependency Inversion Principle)
DIP(의존 관계 역전 원칙)은 추상화된 것은 구체적인 것에 의존하면 안 되고 구체적인 것이 추상화된 것에 의존해야 한다는 개념입니다.
의존 관계를 맺을 때 변화하기 쉬운, 자주 변화되는 것이 아닌 변화가 거의 되지 않는 것에 의존하라는 것입니다.
Swift에서 추상화 된 것은 Protocol입니다.
따라서 DIP를 만족하기 위해 구체적인 클래스와 의존관계를 맺는 것이 아닌, 프로토콜과 의존관계를 맺어야 한다는 것입니다.
프로토콜을 사용하면 느슨한 결합이 만들어지고 이를 통해 새로운 기능을 개발하거나 기존 기능을 수정하고 확장하는 게 쉬워집니다.
예시를 통해 알아보겠습니다.
class Person {
let pet = Dog()
init() {
}
}
class Dog {
}
class Cat {
}
위와 같은 코드는 Person이 Dog를 의존하고 있는 경우이며, Dog 인스턴스를 Person이 직접 생성하는 것을 볼 수 있습니다.
해당 코드에서 Dog가 아닌 Cat으로 수정이 된다면, Person 클래스의 Dog와 연결되어있는 부분들을 모두 변경해야 할 것입니다.
따라서 다음과 같이 의존성 주입을 통해 해당 이슈가 발생하지 않도록 수정해보겠습니다.
// 2. 프로토콜을 통한 의존성 주입
protocol Animal {
func eating()
}
class Person {
let pet: Animal
// 1. 생성자를 통한 의존성 주입
init(animal: Animal) {
self.pet = animal
}
func feed() {
animal.eating()
}
}
class Dog: Animal {
func eating() { }
}
class Cat: Animal {
func eating() { }
}
1. 생성자를 통해, 의존성을 외부로부터 전달받아 생성자에게 할당해주고
2. 프로토콜을 통해, pet 인스턴스에 구현체인 Dog가 아닌 Animal 프로토콜 타입을 주입시켰습니다.
따라서 이제 Person 클래스를 변경하지 않고도, Animal 프로토콜을 만족하는 다른 인스턴스로 수정이 가능한 느슨한 결합이 만들어진 것을 확인할 수 있습니다.
'아키텍처+디자인패턴' 카테고리의 다른 글
MVVM + Clean Architecture (0) | 2022.10.05 |
---|---|
ReactorKit Framework (0) | 2022.06.09 |
Delegate 패턴 (0) | 2022.02.09 |
MVC, MVVM (0) | 2021.11.13 |
다중 스레드 환경에서 싱글톤 패턴 : Synchronized / DCL(Double Checked Locking) / Demand(Lazy) Holder (0) | 2021.10.20 |