
안녕하세요 Ruel입니다.
DI - 의존성 주입에 대해 알아보려고 해요
"의존성 주입" 딱 보기만 해도 느낌이 오지 않나요?
의존시킬 것을 주입한다!!!
아님 말고ㅎ

바로 의존성 주입에 대해 알아봅시다~
Dependency - 의존성
- 의존성이란 간단하게 말해 클래스나 참조 변수
- 예를 들면 커피를 아침마다 같은 카페에서 커피를 사 마시는 것? 이라고 예를 들 수 있을 거 같아요
class User {
var name: String = "Ruel"
}
class Person {
var user = User()
}
let person = Person()
print(person.user.name) // -> "Ruel"
→ 위 코드처럼 Person 클래스는 User 클래스를 내부 변수에 선언하여 사용하고 있습니다.
따라서 Person 클래스는 User 클래스에 의존하고 있다고 말할 수 있죠.
- 만약 User 클래스에 문제가 생기면 Person 클래스도 같이 문제가 생길 가능성이 높습니다. 이렇게 객체끼리 의존성이 높으면, 재사용성이 떨어집니다.
Injection - 주입
- 외부에서 객체를 생성해 넣어주는 것을 주입이라고 합니다.
class User {
var name: String
init(name: String) {
self.name = name
}
}
let user = User(name: "Ruel")
print(user.name) // -> "Ruel"
→ 위 코드처럼 클래스 생성 시 외부에서 값을 만들어 User 클래스에 주입해 주었습니다.
Dependency Injection - 의존성 주입
- 위에서 본 두 가지를 결합한 것입니다.
class User {
var name: String = "Ruel"
}
class Person {
var user: User
init(user: User) {
self.user = user
}
}
let person = Person(user: User())
- 위 코드처럼 Person 클래스를 생성할 때 의존성을 주입해 주었습니다.
- 하지만 단순히 외부에서 값을 넣는 것만으로는 의존성 주입이라고 하지 않습니다.
🌟 생성자를 통해서 외부에서 주입해 준다고 생각하면 됩니다. 의존성 주입은 객체 간의 의존성을 낮춰주는 것을 의미합니다.
Protocol을 활용한 DI
- Protocol을 활용하여 DI(의존성 주입)를 하면 의존 관계를 역전시킬 수 있습니다.
protocol Musician {
var name: String { get set }
func introduce()
}
class Ruel: Musician {
var name: String = "Ruel"
func introduce() {
print("Hello I'm \(name)")
}
}
class Laroi: Musician {
var name: String = "The Kid Laroi"
func introduce() {
print("Hello I'm \(name)")
}
}
class Singer {
var musician: Musician
init(_ musician: Musician) {
self.musician = musician
}
func introduce() {
musician.introduce()
}
func pName() {
print(musician.name)
}
}
let singer = Singer(Ruel())
singer.introduce()
singer.pName()
let singer2 = Singer(Laroi())
singer2.introduce()
singer2.pName()
- protocol을 사용하여 Singer 클래스에 Musician protocol을 채택하고 있는 클래스를 주입하여 사용할 수 있습니다.
이 방법을 사용하면 추상화된 객체에 의존하게 됩니다. - Ruel과 Laroi 클래스를 수정하더라도 Singer 클래스까지 수정할 필요가 없게 됩니다. 각각 독립적인 객체가 되기 때문입니다.
🌟 protocol을 활용하면 모듈화가 가능해지고 확장성 있는 코드를 작성할 수 있습니다.
요약
- 의존성: 서로 다른 객체 사이에 의존 관계가 있다는 것.
- 주입: 외부에서 객체(또는 데이터)를 생성해서 넣는 것(생성자를 통해).
- 의존성 주입: 프로그램 디자인이 결합도를 느슨하게 하고 의존 관계 역전 원칙과 단일 책임 원칙을 따르도록 클라이언트 생성에 대한 의존성을 클라이언트의 행위로부터 분리하는 것.
의존성 주입의 장점 및 사용해야 하는 이유는 다음과 같아요:
- 객체 간의 의존성을 줄여서 코드의 재활용성/확장성이 높아집니다.
- 객체 간의 결합도가 낮아져 유연한 코드/유연한 프로그램을 작성할 수 있습니다.
- 유지보수가 쉬워집니다.
- Unit Test가 가능해집니다(특정 객체에 대한 의존성을 없애고 Test 객체를 주입할 수 있음).
- 객체지향 프로그래밍(OOP)의 5대 원칙(SOLID) 중 하나는 의존 관계 역전 원칙(DIP: Dependency Inversion Principle).
→ 추상화된 것은 구체적인 것에 의존하면 안 되고, 구체적인 것은 추상화된 것에 의존해야 합니다.
즉, 구체적인 객체는 추상화된 객체(프로토콜)에 의존해야 합니다.
이해는 되지만 이해가 안 가는 이 느낌...
알지만 모르는.........
여러 번 보면서 익숙해지면 확실히 이해했다고 할 수 있겠죠? 😂
잘못된 부분 혹은 새롭게 알려주 실부분 있으시면 언제든지 댓글 남겨주세요.💬
감사합니다.🙇🏻♂️
참조 링크
'iOS > Swift' 카테고리의 다른 글
| Swift] Singleton pattern(싱글톤) (0) | 2024.08.11 |
|---|---|
| Swift] Property Observer (0) | 2024.08.10 |