의존관계란?
- B가 변하면 A에 영향을 미친다.
- 의존관계에는 방향성이 있다. A가 B에 의존한다면, B는 A에 의존하지 않는다.
의존관계 종류
- 코드에서 클래스와 인터페이스 틀 통해 드러나는 의존관계
- 런타임 시에 오브젝트 사이에서 만들어지는 의존관계 = 의존 오브젝트
의존관계 주입이란?
- 구체적인 의존 오브젝트와 그것을 사용할 주체, 일반적으로 클라이언트라고 부르는 오브젝트를 런타임 시에 연결해주는 작업
- 클래스 모델이나 코드에는 런타임 시점의 의존관계가 드러나지 않는다. 인터페이스에만 의존하고 있어야 한다.
- 런타임 시점의 의존관계는 컨테이너나 팩토리와 같은 제3의 존재가 결정한다.
- 의존관계는 사용할 오브젝트에 대한 레퍼런스를 외부에서 주입해줌으로써 만들어진다.
- 즉, 설계 시점에는 알지 못했던 두 오브젝트의 관계를 맺도록 도와주는 제 3의 존재가 있다는 것.
- 제3의 존재란, 애플리케이션 컨텍스트, 빈 팩토리, IoC 등을 의미 함.
의존관계 주입 전
private ConnectionMaker connectionMaker;
public UserDao3() {
connectionMaker = new DConnectionMaker();
}
- UserDao3은 이미 설계 시점부터 DConnectionMaker라는 구체적인 클래스의 존재를 알고 있다.
- DConnectionMaker 오브젝트를 사용하겠다는 런타임 의존관계 또한 알고 있다.
의존관계 주입 후
public class UserDao {
private ConnectionMaker connectionMaker;
public UserDao4(ConnectionMaker connectionMaker) {
this.connectionMaker = connectionMaker;
}
}
@Configuration
public class DaoFactory {
@Bean
public UserDao userDao() {
return new UserDao(connectionMaker());
}
@Bean
public ConnectionMaker connectionMaker() {
return new DConnectionMaker();
}
}
- DI 컨테이너(DaoFactory)는 자신이 결정한 의존관계를 맺어줄 클래스의 오브젝트(userDao)를 만들고, 이 생성자의 파라미터로 오브젝트(DConnectionMaker)의 레퍼런스 전달 = 런타임 의존관계