DI(Dependency Injection / 의존성 주입)

Tight Coupling(강한 결합)을 Loose Coupling(느슨한 결합)으로 전환 시키는 방법
제어의 역전(Inversion of Control)의 기술 중 하나

  • 외부에서 두 객체 간의 관계를 결정해주는 디자인 패턴
  • 인터페이스를 사이에 둬서 클래스 레벨애서는 의존 관계가 고정되지 않도록 하고
    런타임 시 관계를 동적으로 주입

정리

  • 두 객체 간의 관계라는 관심사의 분리
  • 두 객체 간의 결합도를 낮춤
  • 객체의 유연성을 높임
  • 테스트 작성을 용이하게 함

의존성 주입의 3가지 방법

  1. 생성자 주입(Constructor Injection)
  • 생성자 주입은 호출 시점에 1회 호출되는것을 보장
  • 주입받은 객체가 변하지 않거나, 반드시 객체의 주입이 필요한 경우 강제하기 위해 사용
  • 많은 디자인 패턴에서 권장됨
  1. 수정자 주입(Setter Injection)
  • 필드 값을 변경하는 Setter를 통해서 의존 관계를 주입하는 방법
  • 주입받는 객체가 변경될 가능성이 있는 경우에 사용
  • 주입할 대상이 없는 경우 오류가 발생할수 있음
  1. 필드 주입(Field Injection)
  • 필드에 바로 의존관계를 주입하는 방법
  • 코드가 간결해져서 과거에 많이 사용하는 방법
  • 필드 주입은 외부에서 접근이 불가능하다는 단점 존재

생성자 주입을 사용해야하는 이유

많은 DI 프레임워크들이 대부분 생성자 주입을 권장함

  • 객체의 불변성 확보
  • 테스트 코드의 작성
  • 순환 참조 에러 방지

IoC(Inversion Of Control, 제어의 역전)

일반적인 프레임워크 디자인 패턴 중 하나

IoC의 개념이 나오게 되면서 프레임워크가 dependency를 container화 시켜 생명주기를 관리

개발자가 작성한 객체나 메서드의 제어를 개발자가 아니라 외부에 위임하는 설계 원칙을 제어의 역전이라고 함

제어 역전에서는 오브젝트 스스로가 사용할 오브젝트를 결정하지도, 생성하지도 않음
원칙의 이름 그대로 제어에 대한 권한이 개발자에서 외부 환경으로 역전 되는 것

profile
learn !

0개의 댓글