DI(Dependency Injection, 의존성 주입)
* 의존성 주입(DI, Dependency Injection)
프로그래밍에서 구성요소간의 의존 관계 소스코드 내부가 아닌 외부의 설정파일 등을 통해 정의되게 하는 디자인패턴중에 하나이다.
간단하게 말해서 의존성 주입이란 외부에서 의존 객체를 생성하여 넘겨주는 것
예를 들어
A Class와 B Class 가 존재한다
A Class가 B Class를 의존할때 B Object를 A가 직접 생성하지 않고 외부에서 생성하여 넘겨주면 의존성을 주입했다고 한다.
왼쪽 그림은 일반적인 A Class에서 B Object를 생성하는 형태이고, 오른쪽 그림은 A Class에서 B Object를 외부에서 생성하여 의존주입하는 형태이다.
DI(의존성 주입)를 위해서 객체를 생성하고 넘겨주는 일은 DI Framework가 하는 일이다. 외부에서 객체를 생성하고 넘겨주는것을 스프링에서는 컨테이너라고 한다.
* 의존성주입을 사용하는 이유
A Class에서 B Class를 사용하기 위해 선언하면 A Class는 B Class에 의존성을 가진다. 여기서 B Class를 수정했을경우 A Class에 생성한 B Class도 수정해야하는 문제가 발생한다. 즉, 결합도가 높아진다.
그래서 의존성주입이 필요하다.
의존성 주입을 사용했을 경우
1. 객체간의 의존성(종속성)이 줄이거나 없앨수 있다.
2. 객체간의 결합도를 줄이면서 코드의 유연성이 상승한다.
나쁜 예)
// Car 클래스 내부에 직접 객체 생성
class Car {
private Engine engine = new Engine();
}
위처럼 생성하게 되면 나중에 Engine 을 바꾸기 위해선 Car 클래스를 변경 해야한다.
좋은 예)
// 의존성 주입 (좋은 예)
class Car {
private final Engine engine;
public Car(Engine engine) {
this.engine = engine;
}
}
생성자 주입 방식으로 의존성을 주입했으며, Engine을 바꾸거나 테스트할 때 Car 클래스는 변경할 필요가 없어
유연하게 대처가 가능하다.