Spring 의존성 주입은 Spring이 의존 객체를 Client 객체에 직접 주입해주는 것을 의미한다. 따라서 원하는 대로 Spring이 주입해줄 수 있도록 '주문서'를 잘 작성하는 방법을 알아본다.
주문서는 XML 또는 어노테이션으로 작성할 수 있는데, 요즘은 보통 어노테이션으로 작성한다. 하지만 레거시 시스템을 이해하기 위해 XML 형식의 의존성 주입 설정 역시 알아두면 좋다.
❑ Setter를 이용한 의존성 주입 설정
Client Class: Car
package com.test.ui;
public class Car {
private PowerUnit powerUnit; // Dependency
public void setPowerUnit(PowerUnit powerUnit) {
this.powerUnit = powerUnit; // Setter를 통한 외부 주입(Injection)
}
}
Dependent Class: ElectricMotor
package com.test.di;
public interface PowerUnit {
void printPowerType();
}
public class ElectricMotor implements PowerUnit {
@Override
public void printPowerType() {
system.out.println("ElectricMotor");
}
}
- Car → ElectricMotor 로 의존관계를 갖고 있다
- Client인 Car에서 Dependency를 주입 받는 방법은 setter(setPowerUnit)다.
위와 같이 의존관계를 가질때 Spring에게 요청할 Spring Bean Configuratio은 아래와 같다
SpringConfig.xml: xml 형식의 Spring Bean Configuration
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="electricMotorBean" class="com.test.di.ElectricMotor"/>
<bean id="carBean" class="com.test.ui.Car">
<property name="PowerUnit" ref="electricMotorBean"/>
</bean>
</beans>
- SpringConfig.xml는 src/main/resource 또는 그 하위 경로에 있어야 한다
- <bean> 태그
- Spring에게 객체 생성을 요청하는 것이다. 즉, Spring은 Car, ElectricMotor 클래스의 객체를 생성해 Container에 담게 되고, 이 때 생성된 객체를 Bean이라고 한다
- id 속성
bean 객체를 구분할 수 있는 id를 정의한다 - class 속성
생성하고자 하는 객체의 Class 경로를 입력한다
- <property> 태그
- 어떤 의존 객체를 주입할 것인지 명시하는 태그.
- ref 속성
ElectricMotor Bean의 id인 'electricMotorBean'을 ref 속성에다가 적어주면 Car 객체에게 ElectricMotor 의존성을 주입하도록 설정하는 것 - name 속성 [중요]
name 에 명시되는 것은 Car에 있는 setter 메서드명(setPowerUnit)에서 set을 제외한 이름과 Mapping된다는 것이다.
즉, Spring은 암묵적으로 name="PowerUnit"를 보고 Car에 있는 setPowerUnit과 Mapping 한다.
❑ 생성자를 이용한 의존성 주입 설정
Client Class: Car
package com.test.ui;
public class Car {
private PowerUnit powerUnit; // Dependency
public Car(PowerUnit powerUnit) {
this.powerUnit = powerUnit; // 생성자를 통한 외부 주입(Injection)
}
}
- powerUnit을 주입 받는 부분이 Setter에서 생성자로 바뀐것 외에 차이점 없음
- 편의상 setter를 제거했지만 있어도 상관없음
Dependent Class: ElectricMotor
→ Setter 케이스와 동일
SpringConfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="electricMotorBean" class="com.test.di.ElectricMotor"/>
<bean id="carBean" class="com.test.ui.Car">
<constructor-arg name="PowerUnit" ref="electricMotorBean"/>
</bean>
</beans>
- <constructor-arg> 태그
- Setter를 사용할 때 사용한 <property> 대신, 생성자를 이용할 것을 알리는 <constructor-arg>를 사용한다.
- 편의상 setter를 제거했지만 있어도 상관없다
'Back-End > Spring' 카테고리의 다른 글
[Spring] IoC 컨테이너 사용하기 - XML Config (0) | 2021.08.19 |
---|---|
[Spring] 값(Value) 주입 설정 방법 - XML Config (0) | 2021.07.24 |
[Spring] 의존성 주입(DI)과 IoC 컨테이너의 개념 (0) | 2021.07.16 |
[Spring] Spring Bean과 의존 관계(Dependency Injection) (0) | 2021.07.09 |
[Spring] 강한 결합(Tight Coupling)과 느슨한 결합(Loose Coupling) (1) | 2021.07.04 |