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을 사용하여 생성자 인수의 이름을 명시적으로 지정
출처
'Spring > Spring' 카테고리의 다른 글
[Spring][Core] 2-7. Bean: Lazy-initialized Beans (0) | 2023.10.14 |
---|---|
[Spring][Core] 2-6. Bean: Autowiring Collaborators (0) | 2023.10.14 |
[Spring][Core] 2-4. Bean: Scopes (0) | 2023.10.14 |
[Spring][Core] 2-2. Bean: Naming (0) | 2023.10.14 |
[Spring][Core] 2-3. Bean: Instantiating (0) | 2023.10.14 |