스프링을 통한 의존성 주입
@Autowired를 통한 속성 주입
[ 의사 코드 ]
운전자가 종합 쇼핑몰에서 자동차를 구매 요청합니다.
종합 쇼핑몰은 자동차를 생산합니다.
종합 쇼핑몰은 타이어를 생산합니다.
종합 쇼핑몰은 자동차에 타이어를 장착합니다.
종합 쇼핑몰은 운전자에게 자동차를 전달합니다.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">
<context:annotation-config />
<bean id="tire" class="exSpringAutowired.KoreaTire"></bean>
<bean id="americaTire" class="exSpringAutowired.AmericaTire"></bean>
<bean id="car" class="exSpringAutowired.Car"></bean>
</beans>
package exSpringAutowired;
import org.springframework.beans.factory.annotation.Autowired;
public class Car {
@Autowired
Tire tire;
public String getTireBrand() {
return "장착된 타이어: " + tire.getBrand());
}
}
메커니즘 정리
type을 구현한 빈이 있는가 ?
예: 2번으로
아니오: No matching bean 에러
빈이 1개 인가?
예: 유일한 빈을 객체에 할당
아니오: id가 일치하는 하나의 빈이 있는가? (예: 해당 빈을 객체에 할당 / 아니오: no unique bean 에러)
DI 마무리
의존 관계가 new라고 단순화해서 표현했지만, 사실 변수에 값을 할당하는 모든 곳에 의존 관계가 생깁니다.
즉, 대입 연산자(=)에 의해 변수에 값이 할당되는 순간 의존이 생긴다는 말입니다.
변수가 지역 변수이건 속성이건, 할당되는 값이 리터럴이건 객체이건 의존은 발생합니다.
의존 대상이 내부에 있을 수도 있고, 외부에 있을 수도 있습니다.
DI는 외부에 있는 의존 대상을 주입하는 것을 의미합니다.
의존 대상을 구현하고 배치할 때 SOLID와 응집도는 높이고 결합도는 낮추라는 기본 원칙에 충실해야
프로젝트의 구현과 유지보수가 수월해집니다.