iOS 인터뷰 준비 6 — 종속성 주입

May 04 2023
인터뷰 질문 제어 반전은 개발자에서 프레임워크로 제어를 이전하는 데 중점을 둔 소프트웨어 디자인 패턴입니다. 그런 다음 프레임워크는 객체 인스턴스를 생성하고 관리하는 일을 담당하고 개발자는 앱별 구성을 제공하는 일을 담당합니다.

인터뷰 질문들

  1. 종속성 주입이란 무엇이며 유용한 이유는 무엇입니까?
  2. iOS에서 의존성 주입이 어떻게 사용되는지 예를 들어주실 수 있나요?
  3. 종속성 주입의 다른 유형(생성자 주입, 세터 주입 등)은 무엇이며 언제 각 유형을 사용해야 합니까?
  4. iOS 앱의 테스트 가능성을 개선하기 위해 종속성 주입을 어떻게 사용할 수 있습니까?
  5. iOS 개발에서 종속성 주입을 사용할 때 발생하는 몇 가지 일반적인 문제나 함정과 이를 피하는 방법에 대해 논의할 수 있습니까?
  6. 인기 있는 iOS 종속성 주입 프레임워크는 무엇이며 주요 기능과 이점은 무엇입니까?
  7. iOS 개발에서 종속성 주입을 사용하는 모범 사례에 대해 논의할 수 있습니까?

Inversion of Control은 개발자에서 프레임워크로 제어를 이전하는 데 중점을 둔 소프트웨어 디자인 패턴입니다. 그런 다음 프레임워크는 객체 인스턴스를 생성하고 관리하는 일을 담당하고 개발자는 앱별 구성을 제공하는 일을 담당합니다.

제어의 흐름을 반전시킬 수 있는 패턴입니다. 이를 달성하기 위해 클래스의 주요 책임을 제외하고 클래스의 모든 책임을 외부로 이동하여 클래스의 종속성을 만듭니다. 따라서 개체는 개체를 만드는 방법을 모릅니다. 이렇게 하면 클래스 간의 긴밀한 관계를 제거하여 코드를 테스트 및 유지 관리할 수 있습니다.

의존성 주입

종속성 주입은 Inversion of Control 원칙을 적용하는 데 도움이 되는 몇 가지 패턴 중 하나입니다. 여러 가지 방법으로 DI를 구현할 수 있습니다.

생성자 주입

생성자 주입에서는 생성자를 통해 모든 종속성을 매개 변수로 전달합니다.

protocol EngineProtocol {
  func start()
  func stop()
}

protocol TransmissionProtocol {
  func changeGear(gear: Gear)
}

final class Car {
  private let engine: EngineProtocol
  private let transmission: TransmissionProtocol

  init(engine: EngineProtocol, transmission: TransmissionProtocol) {
    self.engine = engine
    self.transmission = transmission
  }
}

final class Car {
  private var engine: EngineProtocol?
  private var transmission: TransmissionProtocol?

  func setEngine(engine: EngineProtocol) {
    self.engine = engine
  }

  func setTransmission(transmission: TransmissionProtocol) {
    self.transmission = transmission
  }
}

주요 아이디어는 일부 종속성이 필요한 코드 조각이 자체적으로 종속성을 생성하지 않고 이러한 종속성을 제공하는 제어가 일부 상위 추상화로 연기된다는 것입니다.

Inversion of Control 의 주요 이점은 다음과 같습니다.

  • DI는 코드의 모듈성을 개선하고 이해 및 유지 관리를 더 쉽게 하는 데 도움이 됩니다.
  • 테스트 중에 모의 또는 가짜 종속성을 쉽게 주입할 수 있습니다.
  • 구성 요소에서 사용하는 종속성을 쉽게 교체하거나 교환할 수 있도록 하여 앱의 유연성 및 확장성.