✅ 지난 글에서...
스프링을 통한 싱글톤 레지스트리와 싱글톤 스코프에 대해서 알아보았다.
이번에는 제어의 역전에 대해서 깊이 들어가 보자!
📌 의존관계 주입
스프링의 IoC 방식의 핵심의도가 명확하게 들어내게 하기 위해 고안된 이름으로
오브젝트 레퍼런스가 외부로부터 주입받고 이를 통해 다른 오브젝트와 동적으로 의존관계가 설정되는 것이 핵심이다.
의존관계 주입은 그 근간이 되는 개념인 IoC와 함께 IoC/DI 컨테이너로 불리는데 주입이라는 개념에 맞게 자바에서는 메서드 실행 시 파라미터를 통해 오브젝트의 레퍼런스를 전달해 주는 방법이다 가장 손쉽게 사용하는 방식은 생성자 주입방식이다.
# 의존관계 주입 예제 코드
Public class NewworldDao {
private WorldMaker wordmaker;
public NewworldDao(Worldmaker worldmaker) {
this.wordmaker = worldmaker;
}
}
사용하려는 오브젝트의 선택과 생성제어를 외부로 넘기고 수동적으로 주입받은 오브젝트를 사용한다는 점에서 IoC개념에 잘 맞는데
그래서 스프링을 우리는 DI 컨테이너, DI 프레임 워크로 부르기도 한다.
✅ 의존관계 검색
스프링의 IoC기능에는 주입만 있는 게 아니다 능동적으로 스스로 검색을 통해서 의존관계를 찾아서 맺기도 하는데 그것을 의존관계 검색이라고도 한다. 물론 IoC라고 할 수는 없다 의존관계 검색은 오브젝트의 결정과 생성은 IoC컨테이너한테 맡기지만 가져올 때는 메서드나 생성자 주입 대신 스스로 컨테이너에게 요청한다.
의존관계 검색은 기존 의존관계 주입의 거의 모든 장점을 가지고 있지만 의존관계 주입이 단순하고 깔끔하다 그리고 애플리케이션 컴포넌트가 다른 오브젝트에 의존하기도 하기 때문에 보편적으로는 의존관계 주입을 사용한다.
다만 특정한 상황에서는 의존관계 검색을 활용해야 하지만 걱정할 필요는 없다 이미 스프링에서 제공해주고 있기 때문이다.
의존관계 주입과 의존관계 검색의 가장 큰 차이는 컨테이너가 만드는 빈 오브젝트인가 아닌가의 그 차이다 각각 DI와 DL로 불리는데 DI를 원하는 오브젝트는 먼저 자기 자신이 컨테이너가 관리하는 빈이 되어야 한다.
✅ 메서드를 통한 의존관계 주입
지금까지는 생성자를 통한 주입으로 사용했지만 실제로는 수정자 메서드를 통해 사용을 했다. 이유는 사용하기 편리하기 때문이고 XML 등의 사용하는 경우에 자바빈 규약을 따르고 있는 수정자 메서드가 가장 사용하기에 편리했다.
다만 주의할 점은 메서드의 이름을 잘 지어주는 게 관건이다. 보통은 의존받을 오브젝트 이름을 따르는 게 관례이다.
# 수정자 메서드 의존관계 주입 예제 코드
Public class NewworldDao {
private WorldMaker wordmaker;
public void setWorldmaker(Worldmaker worldmaker) {
this.wordmaker = worldmaker;
}
}
대부분의 IDE는 수정자 메서드를 자동으로 생성하는 기능을 지원하고 있고 인스턴스 변수를 설정해서 기능을 사용하면 편리하다.
생성자와 수정자 메서드를 통한 의존관계 주입은 주입하는 시점이 다를 뿐이지 결과로만 본다면 동일하다.
그리고 스프링은 생성자와 수정자 메서드 그리고 초기화 메서드등 다양한 의존관계 주입은 현재 지원해주고 있다.
[참고] 토비의 스프링 Vol.01