Dependency Injection :: 의존성 주입
Dependency(의존관계)란, 의존대상 B의 변화에 따라 의존하고 있는 A 또한 그 상태가 변하는 관계를 말한다.
객체를 만들 때, 어떤 객체가 다른 객체를 사용해야 하는 상황을 상상해보자. 이 때 객체를 만드는 책임이 해당 객체에 있으면 그 객체는 다른 객체에 의존하게 된다.
의존대상이 되는 객체가 변하게 되면 그 객체에 의존하고 있는 모든 객체들을 의존대상에 맞춰서 변경해주어야 한다. 이처럼 강하게 결합된 구조는 프로그램의 유연성과 확장성에 해가 될 수 있다.
DI (의존성 주입) 은 이 의존관계를 외부에서 결정하고 주입하는 것이다. 다시 말하면 객체가 의존하는 다른 객체를 외부에서 선언하고 이를 넘겨받아 사용하는 것이다.
클래스 모델이나 코드에는 런타임 시점의 의존관계가 드러나지 않아야 하고, 그러기 위해서 인터페이스에만 의존하고 있어야 한다.
의존관계를 인터페이스로 추상화하게 되면, 더 다양한 의존 관계를 맺을 수가 있고, 실제 구현 클래스와의 관계가 느슨해지고, 결합도가 낮아진다.
Inversion Of Control :: 제어의 역전
일반적으로 객체를 생성하고 관리하는 작업을 개발자가 직접 수행하지만, 이러한 작업을 개발자가 아닌 외부에 위임하여 수행하도록 만드는 설계를 제어의 역전이라고 한다. 쉽게 말해, 자동차를 내가 직접 운전하는 대신 운전기사를 고용해서 운전을 시키고 나는 자동차를 잘 만드는 데 집중하는 것이다...!! (비유가 이게 맞나...?)
Ioc는 객체 간의 결합을 느슨하게 해 테스트와 유지 관리를 더 쉽게 하는 설계 원칙이다. 이를 어떻게 프로그램에 적용할 지는 개발자의 몫!! DI는 IoC를 잘 적용한 하나의 예시에 불과하다.