DI (Dependency Injection 의존성 주입)이란?

박성민·2021년 4월 21일
0

iOS

목록 보기
18/30
post-custom-banner

Object Dependencies(객체 의존성)

한 객체가 다른 객체와 상호작용(참조)하고 있다면 그 객체는 다른 객체에 의존성을 가집니다.

class Aclass {
    let name = "a"
}

class Bclass {
    let aClass = Aclass()
}
  • 위 코드에서 Bclass는 Aclass 객체에 의존합니다.
  • Aclass 객체가 수정되면 Bclass도 같이 변경되게 됩니다. 즉, 하나의 모듈이 바뀌면 의존한 다른 모듈까지 변경되어야 합니다.

Dependency Injection(의존성 주입)

외부에서 객체를 생성하여 넣어주는 것입니다. 클래스 생성, 함수를 통해 넣는 등 외부에서 객체를 주입해줍니다.


class Aclass {
    let name = "a"
}

class Bclass {
    let aClass: Aclass
    
    init(with externalVariable: Aclass) {
        self.aClass = externalVariable
    }
}

let b = Bclass(with: Aclass())
  • 위와 같이 필요한(의존하는) 클래스를 직접 생성하는 것이 아닌, 주입해줌으로써 객체 간의 결합도를 줄이고 좀 더 유연한 코드를 작성할 수 있게됩니다.
  • 한 클래스를 수정하였을 때, 다른 클래스도 수정해야 하는 상황을 막아줄 수 있습니다.

Dependency Inversion(의존관계 역전, Inversion Of Control)

단순히 객체를 주입하는 것이 아닌 의존관계 역전을 통해 의존성을 분리합니다.
상위계층이 하위계층에 의존하게 되는 상황을 반전시켜서 하위 계층의 구현으로부터 독립하게 됩니다. 결론적으로 구체적인 클래스보다 Interface(Protocol)을 통해 의존관계를 맺도록 설계해야합니다. 제어의 주체가 Interface(Protocol)에게 있습니다.

protocol DIP: AnyObject {
    var name: String { get set }
}


class Aclass: DIP {
    var name = "a"
}

class Bclass {
    let aClass: DIP
    
    init(with externalVariable: DIP) {
        self.aClass = externalVariable
    }
}

let b = Bclass(with: Aclass())

의존성 주입의 장점

  • 재사용성을 높여줍니다.
  • 객체간의 의존관계를 없애거나 줄일 수 있기 때문에 테스트에 용이합니다.
  • 코드도 단순화 시켜줍니다.
  • 종속적이던 코드를 줄여줍니다. 구성 요소의 종속성이 감소하면, 변경에 민감하지 않습니다.

출처 및 참고

profile
iOS시작~
post-custom-banner

0개의 댓글