본문 바로가기
Swift

Swift에서 의존성 주입(Dependency Injection, DI)과 의존성 역전(Inversion of Control, IoC) 개념 및 예제

by mr.conan 2023. 6. 22.
728x90
반응형

의존성 주입(Dependency Injection, DI) 및 의존성 역전(Inversion of Control, IoC)은 소프트웨어 디자인 패턴 중 하나로, 코드의 유연성과 테스트 용이성을 개선하는 데 도움을 줍니다. 이번 글에서는 Swift에서 DI와 의존성 역전의 개념과 실제 예제에 대해 알아보겠습니다.

  1. DI(Dependency Injection)란? DI는 객체 간의 의존성을 외부에서 주입하는 방식으로, 객체가 직접 의존하는 객체를 생성하거나 초기화하지 않고 외부에서 주입받는 방식을 말합니다. 이를 통해 객체 간의 결합도를 낮추고, 코드의 재사용성과 유지보수성을 향상시킬 수 있습니다.
  2. 의존성 역전(Inversion of Control)란? 의존성 역전은 객체 간의 제어 흐름을 역전시키는 개념으로, 객체의 생성 및 생명주기를 직접 관리하는 대신 외부에서 관리하는 방식입니다. 즉, 객체가 자신이 의존하는 객체를 생성하지 않고 외부에서 주입받아 사용하는 것을 말합니다. 이를 통해 객체 간의 결합도를 줄이고 유연한 시스템을 구성할 수 있습니다.
  3. DI와 의존성 역전의 예제 이제 DI와 의존성 역전의 개념을 예제를 통해 살펴보겠습니다. 예를 들어, 주문(Order)을 처리하는 OrderService 클래스가 있고, 이 클래스는 로깅(Logging)을 위해 Logger 인터페이스에 의존하는 상황을 가정해봅시다.
protocol Logger {
    func log(message: String)
}

class ConsoleLogger: Logger {
    func log(message: String) {
        print("[ConsoleLogger] \(message)")
    }
}

class OrderService {
    private let logger: Logger
    
    init(logger: Logger) {
        self.logger = logger
    }
    
    func processOrder(order: Order) {
        // 주문 처리 로직
        logger.log(message: "주문이 처리되었습니다.")
    }
}

class Order {
    // 주문 정보
}

위 예제에서 OrderService는 로깅 기능을 사용하기 위해 Logger 프로토콜에 의존합니다. DI를 적용하기 위해 OrderService의 의존성을 외부에서 주입받도록 구현하였습니다. 이를 통해 OrderService의 생성 및 사용 시점에 원하는 Logger 인스턴스를 주입할 수 있습니다.

 

let logger = ConsoleLogger()
let orderService = OrderService(logger: logger)
orderService.processOrder(order: order)

위 코드에서는 ConsoleLogger 인스턴스를 생성하고, 이를 주입하여 OrderService를 생성합니다. 이렇게 하면 OrderService는 외부에서 주입받은 Logger 인스턴스를 사용하여 로깅 기능을 수행하게 됩니다. 이로써 의존성 주입을 통해 객체 간의 결합도를 낮추고 유연한 시스템을 구성할 수 있습니다.

 

결론: DI와 의존성 역전은 Swift에서 유연하고 테스트 가능한 코드를 작성하는 데 중요한 역할을 합니다. 이를 통해 객체 간의 결합도를 낮추고 코드의 재사용성과 유지보수성을 향상시킬 수 있습니다. 위 예제를 참고하여 프로젝트에서 DI와 의존성 역전을 적용해보세요.

728x90
반응형