본문 바로가기
Object-Oriented Programming/SOLID

Dependency Injection, 의존성 주입

by yongmin.Lee 2022. 3. 11.

Dependency, 의존성

Dependancy, 의존 관계

  • 위에 그럼 처럼 B 클래스(상위계층)에서 A 클래스(히위계층) 를 내부에 변수로 사용한다
  • B 클래스(상위계층)는 A 클래스(하위계층)에 의존관계가 생기게 됩니다. => 상위계층은 하위계층에 의존하게 된다
  • 객체가 의존성을 스스로 생성

 

Dependency Injection, 주입

(왼) initializer Injection,                          (중)Property Injection,                          (오)Method Injection

  • 내부가 아니라 외부에서 객체를 생성해서 넣어주는 것
  • 객체가 의존성을 스스로 생성하고 관리하지 않는다
  • 우리가 객체에 의존성을 주입시킴으로써 의존 관계 역전 법칙으로 의존 관계를 분리

 

IoC, Inversion of Control, 의존 관계 역전

  • 예를 들어 A 객체에서 B 객체가 필요하다고 할 때(A는 B에 의존), A 클래스에는 B인스턴스를 직접 생성하여 사용할 수 있다
  • 문제는 B의 구현체가 변경되었을 때 발생합니다. A는 B를 직접 참조하고 있으므로 B가 변경될 때 마다 컴파일러는 A를 다시 컴파일해야 합니다. 
  • 이를 해결하려면 B에 대한 인터페이스 B protocol를 정의하고, A에서는 B protocol을 이용
  • 제어의 역전
    • B는 참조를 받는 입장에서 B protocol을 참조하는 방향으로 바뀐다.
    • 기존의 제어 흐름과 소스코드의 의존성이 반대가 되는 것.
  • DIP :
    • 상위 모듈은 하위 모듈에 의존해서는 안된다. 상위 모듈과 하위 모듈 모두 추상화에 의존해야 한다.
    • 추상화는 세부 사항에 의존해서는 안된다. 세부사항이 추상화에 의존해야 한다.
    •  B 클래스가 A 클래스에 의존하는 (B→A) 구조였다면, 의존 관계 역전 법칙에서는 어떤 추상화된 인터페이스(Swift 에서는 프로토콜)에 A, B 객체가 모두 의존(A → 프로토콜 ← B) 한다
    •  

 

Dependency Injection 장점

  • Dependency Injection는 객체간 사이의 의존성을 최소화 해서 Coupling을 줄인다.
  • 결합도(coupling)는 낮추면서 유연성과 확장성은 향상
  • 테스트에 용이
  • 객체간 종속성이 감소하여 상호 변경에 민감하지 않는다.
  • 재사용성을 높여준다

 

 

 

 

참고자료
https://eunjin3786.tistory.com/233

https://baechukim.tistory.com/102

https://medium.com/@jang.wangsu/di-dependency-injection-%EC%9D%B4%EB%9E%80-1b12fdefec4f

'Object-Oriented Programming > SOLID' 카테고리의 다른 글

Dependency Injection Container & Swinject  (0) 2022.03.14
SOLID 원칙  (0) 2021.12.23