Back-End/Spring

[Spring] 의존성 주입 방법(Setter, 생성자 방식) - XML Config

유자맛바나나 2021. 7. 17. 23:24

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를 제거했지만 있어도 상관없다