의존성 주입(DI)이란 클래스 사이의 의존관계를 빈(bean)설정정보를 바탕으로 Spring Container가 자동으로 연결해주는 기능이다.
기존에는 필요로 하는 외부객체가 있으면 객체내부에서 직접 생성해서 사용했다면 Spring DI의 경우 Spring Container에서 객체를 생성해 의존관계를 설정(주입)해주기 때문에 객체내부에서 직접 객체를 생성하여 사용할 필요가 없다.
[DI 미사용]
class 엔진 {
}
class 자동차 {
엔진 v5 = new 엔진();
}
[DI 사용]
@Component
class 엔진 {
}
@Component
class 자동차 {
@Autowired
엔진 v5;
}
public class SampleController{
private final SampleRepository sampleRepository;
@Autowired
public SampleController(final SampleRepository sampleRepository) {
this.sampleRepository = sampleRepository;
}
...
}
@Autowired
어노테이션을 추가하는 방법public class SampleController{
@Autowired
private final SampleRepository sampleRepository;
...
}
setter
를 이용한 방법public class SampleController{
private final SampleRepository sampleRepository;
@Autowired
public setSampleRepository(final SampleRepository sampleRepository) {
this.SampleRepository = SampleRepository;
}
...
}
위의 세가지 의존성 주입방법중 @Autowired
어노테이션을 추가하는 방법이 제일 편리하지만, 생성자를 이용한 의존성 주입방법이 가장 권장된다.
필수적으로 사용해야하는 의존성 없이는 인스턴스를 만들지 못하도록 강제할 수 있기 때문이다.
예를들어, SampleController
가 SampleRepository
없이 동작할 수 없는 구조라면 SampleReposiotry
Bean
의 의존성 주입을 생성자를 이용해 하게 된다면 SampleRepository
없이 인스턴스를 만들지 못하도록 강제할 수 있다.