Spring/Spring

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

noahkim_ 2023. 10. 14. 18:52

1. Dependency Injection

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

 

장점

장점 구분 설명
깔끔한 코드 - 간결함: 명세만 표기하여 구현체를 주입받을 수 있음
- 가독성 높음 + 중복성 감소: 의존성 생성 코드가 없음 
유지보수성 추상화에 의존 → 결합도 낮음 → 변경이 용이
확장성 설정 변경만으로 구현체 교체 가능
테스트 용이성 Mock 객체 주입이 쉬움

 

2. Constructor-based Dependency Injection

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

 

Constructor Argument Resolution

구분 설명 비고
타입에 의한 매칭 생성자에 제공된 인수의 타입으로 의존성 주입
타입이 명확할 때 자동 매칭
인덱스 지정 생성자 인자의 순서를 명시
동일 타입 여러 개일 때 유용
이름 지정 생성자의 매개변수 이름으로 구분
컴파일 시 디버그 정보 또는 @ConstructorProperties 사용 필요

 

예제) 타입에 의한 매칭 

더보기
<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) {
        // ...
    }
}
  • <constructor-arg/>의 순서대로 인수가 제공됩니다.

타입이 모호할 경우

<bean id="exampleBean" class="examples.ExampleBean">
    <constructor-arg type="int" value="7500000"/>
    <constructor-arg type="java.lang.String" value="42"/>
</bean>
  • <constructor-arg/> 요소의 type 속성을 사용하여 타입을 명시적으로 지정할 수 있습니다.

 

예제) 인덱스 지정

더보기
<bean id="exampleBean" class="examples.ExampleBean">
    <constructor-arg index="0" value="7500000"/>
    <constructor-arg index="1" value="42"/>
</bean>
  • index 속성을 사용하여 생성자 인수의 순서를 명시적으로 지정할 수 있습니다.

 

예제) 이름 지정

더보기
<bean id="exampleBean" class="examples.ExampleBean">
    <constructor-arg name="years" value="7500000"/>
    <constructor-arg name="ultimateAnswer" value="42"/>
</bean>
  • 디버그 플래그로 컴파일 O) 생성자의 매개변수 이름을 사용하여 값을 구별
  • 디버그 플래그로 컴파일 X) JDK의 @ConstructorProperties을 사용하여 생성자 인수의 이름을 명시적으로 지정

 

 
 
 
 
 
 
출처