의존관계 주입 DI
- Coding/Spring
- 2018. 3. 17.
의존관계란?
두 개의 클래스 또는 모듈이 의존관계에 있다고 말할 때는 항상 방향성을 부여해줘야한다.
A가 B에게 의존하고있다.
B가 변하면 A에 영향을 미친다.
B의 기능이 추가, 변경이 일어나면 그 영향이 A로 전달된다.
A에서 B에 정의된 메소드를 호출해서 사용하는 경우다.
B에 새로운 메소드가 추가되거나 기존 메소드의 형식이 바뀌면 A도 그에따라 수정되거나 추가돼야 한다.
B의 형식은 그대로지만 기능이 내부적으로 변경되면 결과적으로 A의 기능이 수행되는 데도 영향을 미친다.
방향성이 있다. B는 A의 변화에 영향을 받지 않는다.
A가 인터페이스 B에게 의존하고있다.
인터페이스 B가 변하면 A에게 영향을 주겠지만, 중요한 것은 인터페이스 B를 구현한 클래스가 변하더라도 A에게 영향이 주지 않는다는 사실이다. 인터페이스에 대해서만 의존 관계를 만들어두면 인터페이스 구현 클래스와의 관계는 느슨해지면서 변화에 영향을 덜 받는 상태가 된다. 결합도가 낮다는 말로써, 인터페이스를 통해 의존관계를 제한해주면 그만큼 변경에서 자유로워진다.
의존관계 주입
의존 오브젝트 : A가 인터페이스 B에게 의존할때, 인터페이스 B를 구현한 클래스를 말한다. 즉, 실제 의존 대상인 오브젝트를 말한다.
1) 클래스 모델이나 코드에는 런타임 시점의 의존관계가 드러나지 않는다. 그러기 위해서는 인터페이스에만 의존하고 있어야 한다.
2) 런타임 시점의 의존관계는 컨테이너나 팩토리 같은 제 3의 존재가 결정한다.
3) 의존관계는 사용할 오브젝트에 대한 래퍼런스를 외부에서 제공해줌으로써 만들어진다.
의존관계 주입의 핵심은 설계 시점에는 알지 못했던 두 오브젝트의 관계를 맺도록 도와주는 제 3의 존재가 있다는 것이다. 제 3의 존재는 바로, 관계 설정 책임을 가진 코드를 분리해서 만들어진 오브젝트이다.
의존관계 검색과 주입
코드에서는 구체적인 클래스에 의존하지 않고, 런타임 시에 의존관계를 결정한다는 점은 의존 관계 주입과 비슷하지만, 의존 관계를 맺는 방법이 외부로부터의 주입이 아니라 스스로 검색을 이용하기 때문에 의존관계 검색이라고 불리는 것도 있다. 의존관계 검색은 자신이 필요로 하는 의존 오브젝트를 능동적으로 찾는다. 물론 자신이 어떤 클래스의 오브젝트를 이용할지 결정하지는 않는다. 의존관계 검색은 런타임 시 의존관계를 맺을 오브젝트를 결정하는 것과 오브젝트의 생성 작업은 외부 컨테이너에게 IoC로 맡기지만, 이를 가져올때는 메소드나 생성자를 통한 주입 대신 스스로 컨테이너에게 요청하는 방법을 사용한다.
'Coding > Spring' 카테고리의 다른 글
필드주입과 생성자주입의 차이 (0) | 2019.02.15 |
---|---|
싱글톤 레지스트리 (0) | 2018.05.08 |
코드 리팩토링 (0) | 2018.05.03 |
코드의 응집도와 결합도 (0) | 2018.05.03 |
제어의역전 IOC (0) | 2018.03.17 |