iOS/Swift

[Swift] 의존성 주입 Dependency Injection

최지철 2024. 6. 11. 09:23
728x90
반응형

의존성이란? Dependency

한 객체가 다른 객체에 의존하는 것을 의미한다. 즉, 의존하는 객체가 변경되면 다른 객체도 영향을 받는다는 것을 의미한다.

 

의존성 주입 (Dependency Injection)

외부에서 생성한 후, 의존하는 객체를 전달받아 사용하는 디자인패턴

 

의존성 주입은 굳이 왜하는걸까?

의존성 주입(Dependency Injection, DI)은 객체 지향 프로그래밍에서 객체 간의 의존 관계를 외부에서 주입하여 객체 간 결합도를 낮추고, 코드의 유연성과 재사용성을 높이기 위해 사용된다. 

 

그렇다면 Swift는 프로토콜 지향 프로그래밍인데, 왜 사용하는걸까?

프로토콜 지향 프로그래밍 패러다임을 강조하지만, 의존성 주입(Dependency Injection, DI) 역시 중요한 역할한다.

 

  • 결합도 감소: 객체 간의 결합도를 낮춰, 변경이 발생해도 영향을 최소화할 수 있으며, 객체가 직접 다른 객체를 생성하지 않고 외부에서 주입받기 때문에 가능하다
  • 테스트 용이성: 의존성 주입을 사용하면 모의 객체(Mock)를 쉽게 주입할 수 있어, 단위 테스트를 간편하게 수행할 수 있다.
  • 유연성 및 확장성 증가: DI를 통해 객체를 쉽게 교체하거나 확장할 수 있습니다. 이는 다양한 구현체를 주입하여 사용할 수 있음을 의미
  • 코드의 재사용성 증가: 동일한 인터페이스를 구현하는 여러 객체를 주입받아 사용할 수 있어, 코드의 재사용성을 높일 수 있다.
  • 코드 가독성 및 유지보수성 향상: 의존성이 명확하게 외부에서 주입되므로 코드 구조가 명확해지고 유지보수가 용이하다.

 

Swift에서 의존성 주입을 하는 방법

 

Initializer Injection (생성자 주입)

  • 가장 일반적인 형태의 의존성 주입 방법
  • 생성시, 생성자를 통해 의존성 전달
    init(dataManager: DataManager) {
        self.dataManager = dataManager
        super.init(nibName: nil, bundle: nil)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

Property Injection(속성 주입)

  • 속성을 통해 의존성 주입
  • 주로 설정이 필요한 프로퍼티나 선택적인 의존성에 사용
    var analyticsService: AnalyticsService?

    func setup(analyticsService: AnalyticsService) {
        self.analyticsService = analyticsService
    }

Method Injection (메소드 주입)

  • 메소드를 통해 필요한 시점에 의존성 주입
  • 각각의 메소드 호출 시 필요한 의존성만 주입되므로, 유연성 증가
class TaskManager {
    func performTask(with service: Service) {
        service.doWork()
    }
}

Interface Injection (인터페이스 주입)

  • Protocol을 통해 의존성 주입
  • 서로 긴밀하게 연결된 의존성이 약해져 유지보수 및 확장성을 높일 수 있음

 

728x90
반응형