개발하면서 개발용어도 잘 모르고 코드를 짜다보니... 내 코드를 남들한테 설명할 때 말문이 막히기 시작했다..^^
특히 의존성주입이 어떤 것인지 설명해야했는데, 용어는 많이 들어봤지만 자세히 뭔지 몰랐다...알고보니 내 코드가 이미 의존성주입이 적용된 코드였는데 난 알지 못했던 것! ㅎㅎ...
그래서 오늘은 의존성주입이 뭔지 정리해보려고한다!!!!
의존성 주입이 그래서 뭔데????? 의존성?! 주입?!
처음에 이 단어를 들었을 때 생각났던건 의존성과 주입이 대체 뭔 관계인지 이해가 안된다는 것이었다.
내가 알고있는 의존성의 뜻은 뭔가 서로 엮여있고 참조가 되는 그런..뜻인것같았고 이걸 주입한다는게 띠용이었다.
일단 의존성이란 용어부터 다시 살펴보도록 하자.
의존성은 쉽게 말해서 함수에 필요한 클래스 or 참조 변수에 의존하는것을 의미한다는데...!
그냥 코드를 보도록 하자.
class Chicken {
var egg: Int = 1
}
class Pizza {
var serviceChicken = Chicken()
}
let pizza = Pizza()
print(pizza.serviceChicken.egg)
코드를 보면 Pizza클래스가 Chicken클래스를 내부 변수로 사용하고 있음.
= Pizza클래스가 Chicken클래스에 의존성이 생김
이렇게 정의할 수 있다.
근데 이렇게 되면 발생하는 문제점이 있는데...!
만일 Chicken클래스에 문제가 생긴다면 이를 의존하고 있는 Pizza클래스는 당연히 문제가 생길 수 밖에 없기에 재사용성이 매우 낮아진다. 즉, 재사용성이 가능한건 상위에 있는 Chicken클래스밖에 없음...
이러한 문제를 해결한게 바로 의존성주입이라고 한다..!
그럼 여기서 나오는 '주입'이란 뭘까?
말 그대로다. 뭔가를 넣어주는것이다.
이것도 코드를 보자.
class Chicken {
var egg: Int
init(egg: Int) {
self.egg = egg
}
func setEgg(egg: Int) {
self.egg = egg
}
}
let chicken = Chicken(egg:10)
print(chicken.egg)
chicken.setEgg(egg:49)
코드를 보면, 생성자에서 egg를 받아서 self.egg = egg를 정의하고있다.
즉, egg를 외부에서 생성하여 Chicken 생성자안에 주입하여 객체를 생성한 것이다.
그럼 거의 다왔다... 이렇게 의존성 + 주입을 합치게 되면???
의존성주입
class Chicken {
var egg: Int = 1
}
class Pizza {
var serviceChicken: Chicken
init(chicken: Chicken) {
self.serviceChicken = chicken
}
}
let pizza = Pizza(chicken: Chicken())
이렇게 외부에서 Chicken 객체를 생성해서 새롭게 만드는 Pizza클래스의 생성자안에 주입해주었다.
But, 이렇게 외부에서 주입해주는 것만으로는 의존성 주입이라고 부르지 않음 ! 왜냐고???
바로 '의존 관계 역전 법칙'이란 개념이 나오는데..얜 또 뭐냐..ㅜ

찾아보니 의존성주입에서 의존 관계를 분리시켜야하는데, 이때 사용되는게 의존 관계 역전 법칙이라고 한다.
뭔말인지 1도 모르겠음. 그니까 코드로 살펴보도록하자.
의존 관계 역전 법칙
1. 상위 모듈은 하위 모듈에 의존해서는 안된다. 상위 모듈과 하위 모듈 모두 추상화에 의존해야한다.
2. 추상화는 세부 사항에 의존해서는 안된다. 세부사항이 추상화에 의존해야한다.
protocol KFCProtocol: AnyObject {
var egg: Int { get set }
}
class Chicken: KFCProtocol {
var egg = 1
}
class Pizza {
var serviceChicken: KFCProtocol
init(chicken: KFCProtocol) {
self.serviceChicken = chicken
}
}
let pizza = Pizza(chicken: Chicken())
코드를 보니 조금 감이 잡히지 않나요?????
앞에서 봤던 예시는 피자 클래스가 치킨클래스에 의존하는 구조였다면, 의존 관계 역전 법칙에서는 어떤 추상화된 인터페이스(=프로토콜)에 피자와 치킨 객체가 모두 의존하고 있는 구조라고 볼 수 있다!!!
치킨 클래스 -> KFC프로토콜 <- 피자 클래스
그래서 위 코드는 치킨과 피자가 모두 프로톹콜에 의존해있어 의존관계를 독립시킨 상태라고 한다.
이렇게 의존방향이 역전되어 제어가 반전되는 상황을 제어의 반전이라고 표현한다고 한다...
이렇게 끗!
'개발일기 > Swift' 카테고리의 다른 글
| [Swift] final 키워드 왜 쓰는거냐 (0) | 2025.01.10 |
|---|