제어 역전과 의존성 주입
런타임 의존 관계 설정
의존 관계
- A와 B가 의존관계라는 것은, B가 변하면 A가 변한다는 것
- UML에서의 의존 관계는 설계 모델의 관점에서 이야기 하는 것이다.
UserDao 의존 관계
- 개발자가 인터페이스에 어떤 구현체를 넣을지를 결정할 수 있지만, 이는 UserDao와 ConnectionMaker에서 드러나지 않고 런타임 동안 드러난다.
- 의존 오브젝트 : 런타임 동안 의존 관계를 맺는 대상
- 의존 관계 주입 ( DI ) : 구체적인 의존 오브젝트와 그것을 사용하는 주체 (클라이언트)를 런타임 동안 연결해주는 것
- ex. ConnectionMaker 구현체를 런타임 동안에 UserDao의 ConnectionMaker 인터페이스에 연결해 주는 것
- DI 컨테이너 : DaoFactory가 UserDao에 ConnectionMaker를 DI해주는 것과 같이 DI를 해주는 컨테이너
- 의존 관계를 만들어줄 클래스와 오브젝트를 만들고, 생성자의 파라미터로 오브젝트 전달
의존 관계 주입 규칙
- 클래스 모델이나 코드에는 런타임 시점의 의존 관계가 드러나지는 않는다
- 즉, UserDao 코드에서는 의존 관계가 드러나 있지 않음.
- 런타임 시점 의존관계는 컨테이너나 팩토리 등의 제 3의 존재가 결정함.
- 의존 관계는 사용할 오브젝트를 외부에서 주입해서 결정됨
public class UserDao{
private ConnectionMaker connectionMaker;
public UserDao(ConnectionMaker connectionMaker){
this.connectionMaker = connectionMaker;
}
}
- IoC 규칙에 따라서, DI는 내가 사용할 오브젝트에 대한 선택과 생성 제어를 외부로 넘기고, 수동적으로 주입받은 오브젝트를 사용
의존 관계 검색과 주입
의존 관계 검색 (DL)
- 의존 관계 검색 : 의존 관계를 외부에서 주입하는 것이 아닌 직접 검색해서 찾는 것
- 런타임 시 의존 관계를 맺을 오브젝트 결정, 오브젝트 생성은 외부에 맡김
- 의존관계를 가져올 때 스스로 컨테이너에 요청