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>
출처
'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: Bean Scopes (0) | 2023.10.14 |
[Spring][Core] 2-3. Bean: Naming Beans (0) | 2023.10.14 |
[Spring][Core] 2-2. Bean: Instantiating Beans (0) | 2023.10.14 |