면접 - 스프링프레임워크

개발자 면접 질문 - 의존성 주입 정의

snow-line 2020. 12. 3. 20:44
반응형

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;
}

 

반응형