🤔 의존성 주입을 하는 이유?
의존성 주입을 알아보기 전에 의존성 주입이란 것을 왜 해야하는 것일까?
객체끼리의 의존도가 높으면 한 객체에서 수정이 일어나게 되면 연관된 모든 객체를 손봐야 하는 경우가 있다. Unit test 를 할 경우에도 한 객체의 Test 만 진행하고 싶은데 의존도가 높으면 그럴 수가 없다.
유지보수를 편리하게 하기 위해서라도 의존성 주입을 하면 장점이 많이 생긴다.
💙의존성 주입의 장점💙
- 객체간의 의존성을 줄여준다.
- Unit Test가 용이해진다.
- 코드의 재활용성이 올라간다.
- 유지보수에 좋다.
그럼 의존성 주입이 무엇인지 알아보자.
😘 의존성 (Dependency)
struct Coffee {
let name: String
}
struct Store {
let baverage: Coffee
mutating func giveBaverage() {
print("\(baverage.name) 나왔습니다.")
}
}
코드를 보면 Store
가 Coffee
라는 타입의 변수를 가지고 있다.
이런 것을 Store
가 Coffee
에 의존하고 있다고 할 수 있다.
💉 주입 (Injection)
let americano = Coffee(name: "아메리카노")
let myStore = Store(baverage: americano)
americano
인스턴스를 생성할 때 초기화를 이용해서 name 의 값을 외부에서 넣어주고 있다.
이것을 주입이라고 한다.
🫥 의존 관계 역전 법칙 (Dependency Inversion Principle)
위의 코드를 의존성을 주입해 주었다! 그런데 아직 객체간의 분리가 이루어 지지는 않았다.
추가적으로 DIP 원칙을 적용하면서 객체끼리의 분리도를 떨어뜨려보자.
DIP 원칙은
추상화 된 것은 구체적인 것에 의존하면 안되고 구체적인 것이 추상화된 것에 의존 해야한다.
즉, 구체적인 객체는 추상화된 객체에 의존 해야 한다.
라고한다.
아래의 코드를 보자.
protocol Drinkable {
var name: String { get }
}
struct Coffee: Drinkable {
let name: String
}
struct Store {
let baverage: Drinkable
mutating func giveBaverage() {
print("\(baverage.name) 나왔습니다.")
}
}
Drinkble
이라는 프로토콜을 만들어 주고 Coffee
가 이를 채택하고 있다.baverage
의 타입을 Drinkable
로 바꿈으로써 Coffee
와 Store
객체의 직접적인 연관이 끊어지고 추상객체인 Drinkble
에 의존하게 되었다.
이게 DIP 원칙이다. 구체적인 객체 (여기서는 Coffee 나 Store 가 구체적인 객체이다.)는 구체적인 것에 의존하면 안되고, 추상화된 것에 (프로토콜) 의존해야 한다는 것이다.
struct Coffee: Drinkable {
let name: String
}
만약 여기서 가게에서 음료수로 커피가 아니라 주스를 팔게 되더라도 Juice
라는 객체에 Drinkable
프로토콜을 채택해주기만 하면 baverage
자리에 주스를 넣을 수도 있게 되었다. 🥳
'🍎 iOS > 🕊️ swift' 카테고리의 다른 글
[swift]Date DateFormatter CheetSheet (0) | 2023.01.10 |
---|---|
[swift]@property wrapper (0) | 2023.01.06 |
[swift] 부동 소수점 오류가 나는 이유 (0) | 2023.01.06 |
[swift] 고차 함수 요목조목 보기 (0) | 2023.01.06 |
[iOS] Number Fomatter (0) | 2023.01.06 |