Spring/Spring

[Spring][Core] 2-5. Bean: Dependency Injection

noahkim_ 2023. 10. 14. 18:52

1. Dependency Injection

  • 외부에서 객체 간의 의존성을 주입하는 기법입니다.
  • 개발자가 직접 코드로 수행하는 것이 아니라, 프레임워크의 IoC Container에 의해 자동으로 주입됩니다.
    • 의존성 전달에 대한 제어 흐름의 주체가 개발자에서 IoC Container로 역전됩니다.
    • 이 때문에 "제어 역전"이라는 용어가 사용됩니다. 
  • 생성자 주입, 수정자 주입 방식으로 의존성을 주입합니다.
public class SimpleMovieLister {

	// the SimpleMovieLister has a dependency on a MovieFinder
	private final MovieFinder movieFinder;

	// a constructor so that the Spring container can inject a MovieFinder
	public SimpleMovieLister(MovieFinder movieFinder) {
		this.movieFinder = movieFinder;
	}

	// business logic that actually uses the injected MovieFinder is omitted...
}

 

장점

깔끔한 코드
  • 의존성의 명세만 표기하여 구현체를 주입받을 수 있습니다.
  • 의존성 객체를 생성하는 작업이 코드안에 포함되어 있지 않아 중복성이 줄고 가독성이 향상됩니다.

 

유지보수성
  • 명세(추상화)에 의존하므로 결합도가 낮아집니다.
  • 변경이나 확장이 필요할 때, 한 부분을 수정하더라도 다른 부분에 큰 영향을 미치지 않습니다.

 

설정 유연성
  • 명세(추상화)에 의존하므로 구체적인 구현체를 바꾸는 것이 쉽습니다.
  • 설정만 바꿔서 다른 구현체를 사용할 수 있습니다.

 

테스트 용이성
  • 명세(추상화)에 의존하므로 실제 구현체 대신 모의 객체를 주입하여 쉽게 테스트할 수 있습니다.
  • 테스트를 위한 환경을 구축하는데 용이합니다.

 

2. Constructor-based Dependency Injection

  • 생성자 주입 기반 DI를 의미합니다.
  • IoC Container가 적절한 의존성을 생성자 파라미터의 인자로 전달하여 초기화가 실행됩니다.

 

Constructor Argument Resolution

생성자 인수의 타입에 의한 매칭
  • 생성자에 제공된 인수의 타입을 사용하여 의존성의 구현체를 선택합니다.
  • 만약 생성자 인수의 타입이 모호하지 않다면, XML 설정 <constructor-arg/>의 순서대로 인수가 제공됩니다.
<beans>
    <bean id="beanOne" class="x.y.ThingOne">
        <constructor-arg ref="beanTwo"/>
        <constructor-arg ref="beanThree"/>
    </bean>

    <bean id="beanTwo" class="x.y.ThingTwo"/>
    <bean id="beanThree" class="x.y.ThingThree"/>
</beans>
public class ThingOne {
    public ThingOne(ThingTwo thingTwo, ThingThree thingThree) {
        // ...
    }
}

 

단순 타입의 모호성
  • 단순 값을 사용할 때는 Spring이 타입을 알 수 없습니다.
  • <constructor-arg/> 요소의 type 속성을 사용하여 타입을 명시적으로 지정할 수 있습니다.
<bean id="exampleBean" class="examples.ExampleBean">
    <constructor-arg type="int" value="7500000"/>
    <constructor-arg type="java.lang.String" value="42"/>
</bean>
public class ExampleBean {
    private final int years;
    private final String ultimateAnswer;

    public ExampleBean(int years, String ultimateAnswer) {
        this.years = years;
        this.ultimateAnswer = ultimateAnswer;
    }
}
 
 
생성자 인수의 인덱스 지정
  • index 속성을 사용하여 생성자 인수의 순서를 명시적으로 지정할 수 있습니다.
  • 두 인수의 타입이 동일할 때나 여러 단순 값 중에서 선택해야 할 때 유용합니다.
  • 인덱스는 0부터 시작합니다.
<bean id="exampleBean" class="examples.ExampleBean">
    <constructor-arg index="0" value="7500000"/>
    <constructor-arg index="1" value="42"/>
</bean>
 
 
 
생성자 인수의 이름 지정
  • 생성자의 매개변수 이름을 사용하여 값을 구별할 수 있습니다.
  • 그러나 이 기능을 사용하려면 코드가 디버그 플래그와 함께 컴파일되어야 합니다.
  • 디버그 플래그로 컴파일하지 않는 경우, JDK의 @ConstructorProperties 주석을 사용하여 생성자 인수의 이름을 명시적으로 지정할 수 있습니다.
<bean id="exampleBean" class="examples.ExampleBean">
    <constructor-arg name="years" value="7500000"/>
    <constructor-arg name="ultimateAnswer" value="42"/>
</bean>
 
 
 
 
 
출처