안녕하세요! 피피아노입니다 🎵
이번 포스팅에서는 의존성 주입(Dependency Injection), 줄여서 DI라는 개념에 대해서 Swift 언어 기반으로 살펴보려고 합니다.
본격적으로 들어가기 전에 의존성 주입은 객체지향 언어에서 개발을 하다 보면 점점 커지는 클래스와 복잡한 의존성 관계 속에서 코드를 유연하고 테스트하기 쉽게 만들기 위한 것이라고 생각하시면 됩니다.
그럼 바로 시작하겠습니다!
의존성(Dependency)이란?
의존성이란 "어떤 객체가 다른 객체를 필요로 한다"는 의미로 정리해볼 수 있습니다.
예를 들어서 Car 클래스가 Engine 클래스를 내부적으로 사용한다면, Car는 Engine에 의존한다고 말할 수 있습니다.
class Engine {
func start() {
print("Engine started.")
}
}
class Car {
let engine = Engine()
func drive() {
engine.start()
}
}
이런 코드가 왜 문제가 되냐?
Car 클래스가 Engine을 직접 생성하면, 나중에 Engine을 다른 방식으로 바꾸거나, 테스트용으로 MockEngine을 넣고 싶어도 넣기 힘든 상황이 생길 수 있습니다. 즉, 클래스 간 결합도가 높아지고 유연성이 떨어지게 되는 거죠.
의존성 주입이란?
그래서 등장한 게 의존성 주입!!
의존성 주입(Dependency Injection)이란 클래스가 필요로 하는 객체를 외부에서 주입받는 패턴입니다.
즉, 쉽게 말해서 의존성을 낮추는 거죠.
의존성 주입이라고 해서 "주입"이라는 단어만 보고 의존성을 넣는다 -> 의존성이 강해진다 라고 생각하실 수도 있지만(처음 개발을 접했을 때 제가 그랬어요 ㅎ..) 의존성을 낮추는 방법입니다.
위 예제를 DI로 바꿔보면
class Engine {
func start() {
print("Engine started.")
}
}
class Car {
let engine: Engine
init(engine: Engine) {
self.engine = engine
}
func drive() {
engine.start()
}
}
Car 클래스는 이제 Engine을 직접 만들지 않고, 대신에 외부에서 Engine 객체를 주입해줍니다.
사용 지점은 요 부분입니다.
let engine = Engine()
let car = Car(engine: engine)
car.drive()
근데 한편으로는 "안에서 만드나 밖에서 만드나 어차피 똑같이 만드는 거 아니야?" 라는 생각을 하실 수도 있지만 "어디서 만드냐"가 코드의 구조, 유지보수, 테스트, 확장성에서 큰 차이를 만들게 됩니다.
조금 더 쉽게 이해할 수 있도록 게임으로 비유를 해보겠습니다.
게임에서 A라는 이름의 내 캐릭터가 있다고 가정을 했을 때 그 캐릭터가 검을 들고 싸우는데 나중에 활, 창, 마법봉 이런 다양한 무기를 추가하려면 A 코드를 계속 고쳐야 하지만 반대로, 무기를 외부에서 주입하면, 새로운 무기를 추가해도 A는 건드리지 않아도 되는 거죠!
의존성 주입의 장점
- 유연성 향상
- 테스트 용이
- 클래스 간 결합도 감소
의존성 주입이 된 코드 알아보기
그럼 의존성 주입이 된 코드인지 어떻게 아느냐?
의존성 주입인 코드가 만족하는 조건은 아래 조건을 만족하고 있습니다.
- 클래스 내부에서 사용하는 객체를 직접 사용하지 않는다.
- 필요한 객체를 외부에서 주입 받는다.
- 전달받은 객체를 내부 프로퍼티에 저장해서 사용한다.
class Engine {}
class Car {
let engine: Engine // 3번에 해당
init(engine: Engine) { // 2번에 해당
self.engine = engine // 3번에 해당
}
}
// Car 안에서 Engine()을 직접 만들지 않음 → 1번에 해당
더 간단하게 외우고 싶다면
"내가 만들지 않고, 남이 줘서, 나는 그냥 저장해서 씀"
이렇게 외울 수 있을 것 같습니다. ㅋㅋㅋㅋㅋ
오늘은 여기까지:)
감사합니다.
잘못된 내용이 있거나 더 좋은 내용 피드백은 언제나 환영합니다!
궁금하신 부분은 댓글로 질문 부탁드립니다!
'Apple > Swift' 카테고리의 다른 글
[Swift] Core ML과 MFCC를 활용한 감정 추론 (7) | 2025.05.14 |
---|---|
[Swift] Tuist 살펴보기 (0) | 2025.04.27 |
[Swift] Combine에서 map과 flatMap 살펴보기 (2) | 2025.04.08 |
[Swift] Subscript 이해하기 (4) | 2024.12.30 |
[Swift] Actor 이해하기 (2/2) (4) | 2024.12.15 |