DI란 외부에서 두 객체 간의 관계를 결정해주는 디자인 패턴으로, 인터페이스를 사이에 둬서 클래스 레벨에서는 의존관계가 고정되지 않도록 하고 런타임 시에 관계를 동적으로 주입하여 유연성을 확보하고 결합도를 낮출 수 있게 해준다.
public class Zoo{
private Tiger tiger;
public Zoo(){
this.tiger = new Tiger();
}
}
위에 클래스는 Zoo와 Tiger 클래스가 강하게 결합되 있고, 클래스간의 관계가 맺어있다.
동물원에 새로운 동물이 들어오면 생성자 변경은 필수이다. 그리고 Tiger라는 클래스는 너무 구체적이다. 동물원에 들어오는 동물이 호랑인지 기린인지 몰라도 Animal이라는 인터페이스를 사용하여 추상적으로 구현할 필요가 있다.
public interface Animal{
}
public class Tiger implements Animal{
}
Zoo 와 Tiger 클래스의 결합도를 낮춰주자. Zoo 생성자에서 인스턴스를 생성하는것이 아닌, 외부에서 생성해서 가져오는 것이다. 그러면 Zoo에서 Tiger라는 구체클래스에 의존하지 않는다.
public class Zoo{
private Animal animal;
public Animal(Animal animal){
this.animal = animal;
}
}
이제, 애플리케이션 실행시점에 필요한 객체를 생성하고, 의존성이 있는 두객체를 연결하기 위해 한 객체를 다른 객체로 주입시켜야 한다. 다음과 같이 Tiger라는 객체를 생성하고, 그 객체를 Zoo로 주입시켜주기 위해 DI 컨테이너가 필요하다.
이를 스프링 프레임워크에서 지원해준다. 스프링은 특정 위치로부터 클래스를 탐색하고, 객체를 만들며 객체의 관계까지 설정해준다. 이때문에 스프링은 DI 컨테이너라고 불린다.
public class BeanFactory {
public void Zoo() {
// Bean의 생성
Animal animal = new Tiger();
// 의존성 주입
Zoo zoo = new Zoo(animal);
}
}
Spring 은 의존성 주입을 도와주는 DI 컨테이너로써, 강하게 결합된 클래스들을 분리하고, 애플리케이션 실행시점에 객체간의 관계를 정리해 줌으로 결합도를 낮추고, 유연성을 확보해준다. 이 모든게 객체의 주입을 DI 컨테이너에서 관리를 해주기 때문이다.
1. 의존성이 줄어든다
의존대상의 변화하면 이에 맞게 수정해야해서 변화에 취약한데, 의존성 주입을 통해 대상이 변경해도 수정할 필요가 X
2. 재사용성이 높아짐
3. 테스트하기 좋아짐
한 코드에서 합쳐있는것을 분리 함으로 분리해서 테스트 가능
참고 블로그
https://mangkyu.tistory.com/150
[Spring] 의존성 주입(Dependency Injection, DI)이란? 및 Spring이 의존성 주입을 지원하는 이유
1. 의존성 주입(Dependency Injection)의 개념과 필요성 [ 의존성 주입(Dependency Injection) 이란? ] Spring 프레임워크는 3가지 핵심 프로그래밍 모델을 지원하고 있는데, 그 중 하나가 의존성 주입(Dependency Inj
mangkyu.tistory.com
'Spring framework' 카테고리의 다른 글
[Spring] st_distance_sphere을 사용하여 위치기반 조회 구현 (0) | 2023.12.17 |
---|---|
[Spring] @Value 어노테이션 사용시 Access key cannot be null (1) | 2023.12.02 |
[Spring] @Controller와 @RestController의 차이 (0) | 2023.09.06 |