[Swift] 의존성 주입(Dependency Injection)이란?

2025. 4. 18. 17:45·Apple/Swift
목차
  1. 의존성(Dependency)이란?
  2. 의존성 주입이란?
  3. 의존성 주입의 장점
  4. 의존성 주입이 된 코드 알아보기
728x90
반응형

안녕하세요! 피피아노입니다 🎵

 

이번 포스팅에서는 의존성 주입(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는 건드리지 않아도 되는 거죠!

 

의존성 주입의 장점

  • 유연성 향상
  • 테스트 용이
  • 클래스 간 결합도 감소

의존성 주입이 된 코드 알아보기

그럼 의존성 주입이 된 코드인지 어떻게 아느냐?

의존성 주입인 코드가 만족하는 조건은 아래 조건을 만족하고 있습니다.

  1. 클래스 내부에서 사용하는 객체를 직접 사용하지 않는다.
  2. 필요한 객체를 외부에서 주입 받는다.
  3. 전달받은 객체를 내부 프로퍼티에 저장해서 사용한다.
class Engine {}

class Car {
    let engine: Engine  // 3번에 해당

    init(engine: Engine) {  // 2번에 해당
        self.engine = engine  // 3번에 해당
    }
}
// Car 안에서 Engine()을 직접 만들지 않음 → 1번에 해당

 

더 간단하게 외우고 싶다면 

 

"내가 만들지 않고, 남이 줘서, 나는 그냥 저장해서 씀"

 

이렇게 외울 수 있을 것 같습니다. ㅋㅋㅋㅋㅋ

 

 

오늘은 여기까지:)


감사합니다.

 

잘못된 내용이 있거나 더 좋은 내용 피드백은 언제나 환영합니다!

궁금하신 부분은 댓글로 질문 부탁드립니다!

 

728x90
반응형

'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
  1. 의존성(Dependency)이란?
  2. 의존성 주입이란?
  3. 의존성 주입의 장점
  4. 의존성 주입이 된 코드 알아보기
'Apple/Swift' 카테고리의 다른 글
  • [Swift] Core ML과 MFCC를 활용한 감정 추론
  • [Swift] Tuist 살펴보기
  • [Swift] Combine에서 map과 flatMap 살펴보기
  • [Swift] Subscript 이해하기
P_Piano
P_Piano
Apple 생태계 개발자가 되기 위한 학습과 경험의 기록
    반응형
    250x250
  • P_Piano
    피피아노의 개발 일지
    P_Piano
  • 전체
    오늘
    어제
    • 분류 전체보기 (202) N
      • Apple (120) N
        • iOS (22)
        • visionOS (4)
        • Swift (65)
        • UIKit (2)
        • SwiftUI (21) N
        • RxSwift (2)
        • Xcode (4)
      • C언어 (5)
      • C++ (8)
      • Dart (1)
      • Python (3)
      • JavaScript (17)
      • Git (1)
      • CS (39)
        • 디자인 패턴 (6)
        • 네트워크 (20)
        • 운영체제 (8)
        • Database (5)
        • 자료구조 (0)
      • IT 지식 (2)
      • IT 뉴스 (4)
      • 출처 표기 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    ios
    Xcode
    메서드
    UIKit
    swiftUI
    클래스
    이니셜라이저
    Vision Pro
    디자인패턴
    Initializers
    함수
    비동기
    visionOS
    자바스크립트
    운영체제
    네트워크
    Optional
    SWIFT
    스위프트
    옵셔널
    제어문
    티스토리챌린지
    combine
    코딩테스트
    프로세스
    변수
    배열
    연산자
    오블완
    프로퍼티 래퍼
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
P_Piano
[Swift] 의존성 주입(Dependency Injection)이란?

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.