이른바 Dependency Injection(의존적 주입)?

자신을 이해하기 위해 총결산!만약 잘못이 있으면 반드시 지적해 주십시오.

1.Dependency Injection(DI)은 무엇입니까?


의존
주사즉
@hshimo
밖에서 대상자를 받는 셈이다.

2. DI가 편한 이유/쓰고 싶은 이유


* @hshimo
유연성 없음-> 결정타이기 때문에 유연성이 없어 맞춤 제작이 어렵습니다.
테스트하기 어려움-> 외부에서 동작을 동적으로 변경할 수 없기 때문에 테스트하기 어려움
그렇게 말해도 모르겠지?그럼 예를 들어 생각해 봅시다.

3. 예를 들어 고려한다


예를 들어 의사, 간호사, 병력이 있으면 보통 의사들은 병력을 써서 간호사에게 건네주고 환자에게 대처하죠?(DI 후)
그런데 의사가 병력서를 다 써서 간호사에게 던지면 어떻게 될까?간호사는 항상 의사가 환자의 상황을 물어본 후에 병력을 작성해야 한다.(DI 전)
이렇게 되면 간호사의 업무가 늘어나 매우 고생스럽다.그리고 의사가 병력을 수정하려면 간호사가 처음부터 다시 써야 한다.(DI 전)

DI 이전 코드
protocol Carte {}
class Doctor{
   func assignNurse() -> Nurse{
      var nurse = Nurse()
      return nurse
   }
}

class Nurse {
    let carte: Carte

    init() {
        carte = Carte()
    }
}
main.swift
doctor.assignNurse()
DI 이후 코드
class Carte {}
class Doctor{
  func makeCarte() -> Carte{
    var carte = Carte()
    return carte
  }
}

class Nurse {
    let carte: Carte

    init(_ carte: Carte) {
        self.carte = carte
    }
}
main.swift
var carte = doctor.makeCarte()
var nurse = Nurse(carte)

DI 후면 코드에서 Nurse 클래스 init(Carte가 생성되지 않았습니다!)
그리고 외부에서 캐럿 대상을 주입하는 것이기 때문에 캐럿이 변경된 경우 누즈의 내용을 고칠 필요가 없어 테스트가 수월하다.
DI가 사용하고 싶은 이유를 간단히 설명하자면.
한 반의 업무가 너무 많아서(반에 의존) 원활한 진행을 위해 업무를 분담해야 한다.간호사는 병력의 내용을 알고 싶지만 만드는 방법을 전혀 모른다.
에이, 예를 들면 코드가 미묘하다??미안합니다.

4. 다양한 곳에서 Dependency Injection 사용


1. Viewcontroller에서 다른 ViewController를 열 때


ViewController.swift
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if getIndexPathForSelectedCell() != nil {
            let newView = segue.destination as! DetailViewController
            newView.folderIndexPath = getIndexPathForSelectedCell()!
            newView.dataSource = self.dataSource
        }
    }

DetailViewController.swift
    var folderIndexPath:IndexPath
    var dataSource:DataSource

    init(_ folderIndexPath:IndexPath, _ dataSource:DataSource) {
        self.folderIndexPath = folderIndexPath
        self.dataSource = dataSource
    }
여기서 DataSource반은 ViewController의 어딘가에 있는 initialize를 통해Detail ViewController를 통과합니다.

2. 사전에 AppDelegate에


AppDelegate.swift
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.


        //dependency injection
        let rootViewController = window?.rootViewController as! UINavigationController
        let photoViewController = rootViewController.topViewController as! PhotoViewController

        photoViewController.store = PhotoStore()

        return true
    }
PhotoViewController.swift
    var store:PhotoStore!
AppDelegate에서 화면에 나타나는 첫 번째 ViewController를 지정합니다.항상 ViewController가 마음대로 나오지만, 여기에는 PhotoViewController가 표시됩니다.
이외에도 PhotoStore급 initialize도 이곳에서 PhotoViewController에 DI(주입)를 진행한다.
참고 자료!
원숭이도 알아!Dependency Injection: 의존성 주입
Dependency Injection in Swift

좋은 웹페이지 즐겨찾기