1. 의존성 주입
- 객체 간의 의존 관계를 객체 자신이 아닌 외부의 조립기가 수행한다.
2. 구현 방식
- 생성자 방식 : 객체를 생성하는 시점에 의존하는 객체를 모두 전달받을 수 있다.
- Setter (프로퍼티) 방식 : 어떤 의존 객체를 설정하는지 메서드의 이름으로 알 수 있다.
- 필드(인터페이스) 방식 : 의존성을 주입하는 함수를 포함한 인터페이스를 작성하고, 인터페이스를 구현하도록 함으로써 실행시에 이를 통하여 의존성을 주입
* Field 방식을 추천하지 않는 이유
- 단일 책임의 원칙 위반 : 생성자 방식을 사용하면 파라미터가 많아짐과 동시에 하나의 클래스가 많은 책임을 갖는것을 알수 있으나 필드 방식은 의존성 주입이 쉬워 알기 어렵다.
- 객체가 변할 수 있다.(불변성) : 생성자 방식과 다르게 Field Injection은 final을 선언할 수 없다. 그래서 객체가 변할 수 있다.
- 순환 의존성 확인 불가 : 생성자 방식은 순환 의존성을 가질 경우 BeanCurrentlyCreationException 을 발생해서 알 수 있다.
- 의존성이 숨는다 : 숨은 의존성만 제공해준다.
* 생성자 방식은 final 선언이 가능하여 객체가 불변하도록 할 수 있고 순환 의존성도 확인할 수 있어서 추천된다.
3. 장점
- 의존하는 클래스의 구현이 완성되어 있지 않아도 테스트 할 수 있다.
- 모듈간의 결합도를 낮출수 있다.
* Constructor 방식
public class Example{
private final AService aService;
private final BService bService;
@Autowired
public Example(AService aService, BService bService){
this.aService = aService;
this.bService = bService;
}
}
* setter 설정 방식
public class Example{
private final AService aService;
private final BService bService;
@Autowired
public void setAService(AService aService){
this.aService = aService;
}
@Autowired
public void setBService(BService bService){
this.bService = bService;
}
}
* field 방식
public class Example{
@Autowired
private final AService aService;
@Autowired
private final BService bService;
}
'면접 - 스프링프레임워크' 카테고리의 다른 글
개발자 면접 질문 - 스프링 프레임워크 정의 (0) | 2020.12.03 |
---|---|
개발자 면접 질문 - Bean 태그의 Scope 범위(속성 값) (0) | 2020.12.03 |
개발자 면접 질문 - interceptor, filter, AOP 차이 (0) | 2020.12.03 |
개발자 면접 질문 - 스프링 빈 생명 주기 (0) | 2020.12.03 |
개발자 면접 질문 - AOP 정의 (0) | 2020.12.03 |