250x250
반응형
Notice
Recent Posts
Recent Comments
Link
관리 메뉴

스윞한 개발자

Swift 기초 문법 - 의존성 주입 Dependency 본문

Swift 이론

Swift 기초 문법 - 의존성 주입 Dependency

스윞남 2024. 1. 25. 18:50
728x90
반응형
SMALL

이번 포스팅은 의존성 주입에 대해 정리해볼게요!

 

 

의존성 주입(DI)은 소프트웨어 디자인 패턴 중 하나로, 컴포넌트 간의 의존 관계를 느슨하게 결합시키기 위해 사용되는 기법입니다.

의존성(Dependency)

하나의 클래스나 모듈이 다른 클래스나 모듈의 기능을 사용하거나 의존하는 경우 해당 클래스나 모듈은 의존성을 가지고 있습니다. 이러한 의존성은 주로 객체 생성, 데이터 처리, 외부 서비스 액세스 등의 작업을 포함할 수 있습니다.

 

예를 들어, 클래스 A가 클래스 B의 메서드나 속성을 사용한다면 A는 B에 의존하고 있습니다.

주입(Injection)

의존성을 주입한다는 것은 외부에서 해당 의존성을 제공하여 객체 내부에 직접 생성하는 것이 아니라, 외부에서 주입된 의존성을 사용하도록 하는 것을 의미합니다. 일반적으로 이는 생성자 주입, 메서드 주입, 속성 주입 등의 방식으로 이루어집니다!

 

 

장점

  1. 테스트 용이성 : 의존성을 주입함으로써 테스트 중에 모의(mock) 객체를 주입하여 테스트 케이스를 작성하기가 용이해집니다.
  2. 재사용성 : 의존성을 분리하여 코드를 재사용할 수 있고, 다른 구성 요소에서도 같은 의존성을 사용할 수 있습니다.
  3. 유지 보수성 : 객체 간의 결합도가 낮아져 변경 사항이 다른 부분에 미치는 영향이 줄어듭니다.
  4. 모듈성 : 코드를 더 작은 모듈로 분리하고 각 모듈 간의 의존성을 명시적으로 관리할 수 있습니다.

 

종류

 

생성자 주입(Constructor Injection) : 객체 생성 시 의존성을 주입하는 방법

class UserManager {
    let networkService: NetworkService

    init(networkService: NetworkService) {
        self.networkService = networkService
    }}

 

메서드 주입(Method Injection) : 메서드 호출 시에 의존성을 주입하는 방법

class UserManager {
    func fetchData(using networkService: NetworkService) {
        // 사용
    }
}

 

속성 주입(Property Injection) : 의존성을 프로퍼티로 주입하는 방법

class UserManager {
    var networkService: NetworkService!
}

 

 

class Car {
    let engine: Engine
    
    // 생성자 주입
    init(engine: Engine) {
        self.engine = engine
    }
    
    // 메서드 주입
    func start() {
        engine.start()
    }
}

protocol Engine {
    func start()
}

class ElectricEngine: Engine {
    func start() {
        print("Electric engine started")
    }
}

class GasolineEngine: Engine {
    func start() {
        print("Gasoline engine started")
    }
}

let electricCar = Car(engine: ElectricEngine())
electricCar.start()  // Electric engine started

let gasolineCar = Car(engine: GasolineEngine())
gasolineCar.start()  // Gasoline engine started

 

위의 예시에서 Car 클래스는 Engine 프로토콜에 의존하고 있으며, 생성자 주입을 통해 외부에서 Engine 구현체를 주입받습니다. 이렇게 함으로써 Car 클래스는 어떤 종류의 Engine이라도 사용할 수 있게 되며, 변경이 쉬워지고 테스트가 용이해집니다!

 

 

 

참고(출처) : 개발하는 정대리, 야곰(Swift5)

728x90
반응형
LIST