[전문가를 위한 스프링 5] 3장_Spring IoC 와 DI
1. IoC 종류
IoC (Inversion of Control ) 은 두 가지로 나뉜다 : DI, DL
DI 는 IoC 컨테이너가 컴포넌트에 의존성을 주입
시켜 준다. 반면, DL 은 컴포넌트 스스로 의존성 참조
를 가져온다.
DI (Dependency Injection)
생성자 주입 : IoC 컨테이너는 해당 컴포넌트를 초기화할 때, 컴포넌트에 필요한 의존성을 전달
1
2
3public ConstructorInjection(Dependency dp){
this.dp = dp;
}세터 주입 : setter method 를 호출해서, 의존성을 나중에 제공 가능
1
2
3public void setDependecy(Dependency dp){
this.dp = dp;
}필드 주입 : 스프링 컨테이너가 reflection 을 이용해 필요한 의존성을 주입
1
2
3
4
5
public class Singer {
private Inspiration inspirationBean;
...
DL (Dependency Lookup)
Depenency Pull : 중앙 registry 에서 의존성을 직접 가져오는 방식 ( register -> container )
1
context.getbean();
Contextualized Dependency Lookup : 특정 중앙 registry 에서 의존성을 가져오는 것이 아니라, 자원을 관리하는 컨테이너에서 의존성을 가져오는 방식
1
2
3publicv void lookup(Container ct){
this.dp = (Dependency) ct.getDependency("myDependency");
}
그렇다면, 의존성 주입 vs 의존성 룩업 ? 의존성 주입을 사용해라.
주입을 이용하면,
- 사용자 클래스는 IoC 컨테이너와 완전리 분리된다.
- 직접 테스트용 의존성을 주입하기 쉬우므로 테스트 하기 쉽니다.
그렇다면, 생성자 주입 vs 세터 주입 vs 필드 주입? 상황에 따라 선택해라.
- 생성자 주입 :
컴포넌트에 의존성 주입을 보장
해야할 때 - 세터 주입 :
새로운 객체를 생성하지 않고 의존성을 교체
할 때 - 필드 주입 : 다음 이유로, 권장하지 않는다.
- 클래스가 비대해지는 상황을 생성자 주입이나 수정자 주입에서는 쉽게 알아 챌 수 있지만, 필드 주입은 아니다.
- 클래스는 public interface 의 메서드나 생성자로 필요한 의존성 타입을 명확히 전달해야하는데, 필드 주입을 이용하면 어떤 타입의 의존성이 필요한지 명확하지 않다.
- final 필드에 사용할 수 없다.
- 의존성을 수동으로 주입해야하므로, 테스트 코드 작성이 어렵다.
2. BeanFactory, ApplicationContext
- Bean : 컨테이너가 관리하는 모든 컴포넌트
- BeanFactory interface : 컴포넌트의 라이프사이클과 의존성을 관리
- ApplicationContext interface (extends BeanFactory) : DI 외에도, 트랜잭션, AOP, 애플리케이션 이벤트 처리 기능 제공