의존성 주입이라는 뜻으로 스프링만의 기능은 아니고 객체지향 프로그래밍의 방법론 중 하나이다.
휴대폰의 배터리를 비유로 들면
배터리 일체형 휴대폰의 경우 배터리의 수명이 다해버리면 휴대폰을 새로 구입해야 한다. 반면에 배터리 분리형 휴대폰의 경우 배터리의 수명이 다하면 배터리만 교체하면 된다.
여기서 휴대폰을 프로그램, 배터리를 기능이라고 생각해보면 분리형이 더 효율적이다. 일부 기능의 오류가 발생하거나 기능을 수정하거나 삭제하는게 전체적인 프로그램에 영향을 줄 수 있기 때문이다. 이것이 객체지향 프로그래밍의 유연성이다.
또 일체형이든 분리형이든 휴대폰은 배터리에 의존한다. 여기서 배터리를 넣는 행위를 의존성 주입이라고 할 수 있고, 좀 더 유연한 방식이 분리형인 것이다.
XML에 빈 태그를 이용해 명시해주거나 어노테이션을 이용하면 스프링 컨테이너 안에 빈 객체들이 생성된다.
그렇게 위 그림처럼 빈들은 로직에 의존하게 되고, 또 그림에서 가장 오른쪽 객체를 보면 객체 안의 객체가 다른 객체를 의존하는 관계도 표현하고 있다.
예를 들면, 회원정보를 조회하는 서비스 클래스는 회원 DB에
접근하는 DAO 클래스를 의존한다.
public MemberSelectService(MemberDAO memberDAO) {
this.memberDAO = memberDAO;
}
이러한 서비스 객체의 생성자를 정의해놨다면
<bean id="memberDAO" class="kjh.member.dao.daoMemberDAO" ></bean>
<bean id="selectService" class="kjh.member.service.SelectService">
<constructor-arg ref="memberDAO"></constructor-arg>
</bean>
다음과 같이 bean 태그 안에 contructor-arg 태그를 이용해 명시함으로 객체를 주입할 수 있다.
public void setName(String name) {
this.name = name;
}
어떤 속성에 대한 setter를 사용할 경우
<bean id="memberInfo" class="kjh.member.memberInfo">
<property name="name" value="Kim Jin Hyeok" />
</bean>
위처럼 property태그의 name과 value 속성으로 주입할 수 있다.