학교 공부

[Spring] Dependency Injection(의존성 주입) 이란?

연듀 2021. 10. 6. 14:47

https://medium.com/analytics-vidhya/dependency-injection-concept-ofspring-framework-d9c3688005f8

 

Dependency Injection: Concept of Spring Framework

Spring framework came into limelight when a book named J2EE Development Without EJB by Rod Johnson was released in 2002. The author with…

medium.com

 

 

An example of spring DI container

 

 

DI란? 

 

 

DI란 외부에서 두 객체 간의 관계를 결정해주는 디자인 패턴으로, 인터페이스를 사이에 둬서 클래스 레벨에서는 의존관계가 고정되지 않도록 하고 런타임 시에 관계를 다이나믹하게 주입하여 유연성을 확보하고 결합도를 낮출 수 있게 해준다.


의존성 주입이 없다면, 애플리케이션 클래스는 유틸리티 클래스가 필요시 인스턴스화 해 사용하기 때문에 클래스 간의 결합이 증가한다. 이런 경우에 유연성이 떨어진다.

의존성 주입은 이러한 문제를 해결해준다.

DI 컨테이너에서는 의존성이 있는 두 객체를 연결하기 위해 유틸리티 클래스 객체를 다른 응용 프로그램 클래스 객체로 주입시킨다. 즉, 의존성 주입이란 필요한 객체를 직접 생성하는 것이 아닌 외부로 부터 필요한 객체를 받아서 사용하는 것이다.

이를 통해 객체간의 결합도를 줄이고 코드의 재활용성을 높여준다.




 

외부에 있는 spring container로부터 bean bean 사이에 의존성을 주입해준다.

 

장점

 

1. 코드의 재사용성이 증가한다. 

일부 인터페이스의 다른 구현이 필요한 경우, 코드를 변경할 필요없이 해당 구현을 사용하도록 components를 구성할 수 있다.

 

2. 클라이언트는 서비스와 분리되어 있으므로, 클라이언트를 테스트 할 때 서비스를 모의객체로 사용하여 더 쉽게 테스트할 수 있다. 즉 서비스 코드가 완벽하게 짜여있지 않더라도 클라이언트 코드를 테스트 하는데에는 문제가 없다.

 

 

 

 

 

public class PetOwner{
    private AnimalType animal;

    public PetOwner() {
    	this.animal = new Dog();
    }    
}

이 코드는 DI가 적용되지 않은 코드이다.

AnimalType 오브젝트가 수정되면 PetOwner 오브젝트도 수정 되어야 한다.
PetOwner 오브젝트는 AnimalType 오브젝트에 의존한다. 두 오브젝트 사이에 강한 결합이 있다.

 

 

 

 

 

public class PetOwner{
    private AnimalType animal;

    public PetOwner(AnimalType animal) {
    	this.animal = animal;
    }    
}

public class Dog 
	implements AnimalType{
    //…
}

public class Cat 
	implements AnimalType{
    //…
}

DI(의존성 주입)을 사용한 코드이다.

AnimalType 오브젝트인 Dog과 Cat을 생성하고,  스프링 컨테이너에 의해 PetOwner 생성자의 인자에 Dog cat을 주입시킨다.

 


이처럼 DI는 객체 자체가 아닌 프레임워크에서 객체의 종속성을 주입하는 디자인 패턴이다.

프레임워크에서 동적으로 주입하므로 여러 객체 간의 결합을 줄인다.

 

 

 

 

 

 

 

참고: https://mangkyu.tistory.com/150