본문 바로가기

Spring Study

[Spring] Dependency Injection

728x90
public class PetOwner{
	private AnimalType animal;
    
    public PetOwner(){
    	this.animal = new Dog();
   	}
}

 

위 코드에서 PetOwner Class는 AnimalType으로 Dog만 소유 할 수 있는 형태이다.

PetOwner와 AnimalType은 강한 결합도를 가진다고 볼 수 있다.

만약 Dog대신 Cat을 소유하고싶다면 PetOwner의 소스코드를 변경해야하는 문제점이 있다.

 

이런 강한 결합도, 소스코드를 직접 변경해야하는 문제점을 해결하기 위해 Dependency Injection 방법을 사용할 수 있다.

 

DI - 1

Bean Container는 Bean들을 만든다. 여기서 Bean은 저번에 포스팅했던 글의 POJO와 같다.

그리고 Config 파일에 따라서 Bean과 Bean사이에 의존성 주입을 수행한다.

 

DI - 2

 

위 사진은 Dependency Injection 방법을 사용하여 코드를 작성한 예시이다.

IoC Container(Spring Container) 가 Config 파일에 따라 아래의 Dog class나 Cat class 중 하나를

PetOwner에 주입시켜주고 만약 다른 AnimalType을 주입시키고 싶다면 DI - 1 사진에서 처럼

직접 소스코드를 변경하는 것이 아닌 외부의 Config 파일만 변경을 하면 다른 AnimalType을 주입시켜 줄 수 있다.

 

Config metadata를 나타내는 방식에는 3가지가있는데

- XML 파일 이용

- Java annotations 이용

- Java-based Configuration을 이용하여 설정하는 것이다.

 

3가지 중에 하나만 알아서는 안되고 상황에 따라 3가지 중 1가지를 사용할 수 있으니 3가지 모두 알아놓는것이 좋다. 

 

Spring의 Container에는 2가지 유형이 있다.

- BeanFactory

- ApplicationContext 이다.

 

BeanFactory

 

BeanFactory는 간단한 factory이며 주로 DI용도로 사용한다.

자원이 제한된 mobile.. 같은 것을 사용할 때 사용한다.


ApplicationContext

 

BeanFactory보다 좀 더 발전하고 복잡한 factory이다.

BeanFactory환경 외에 환경에 사용한다.

인터페이스 이름은 ApplicationContext이고 

이 인터페이스를 실제로 구현한 Class는 ClassPathXmlApplicationContext 이다.

 

ex) ApplicationContext context = new ClassPathXmlApplicationContext("kr/ac/daneng4/spring/beans/bean.xml");

 

HelloWorld obj = (HelloWorld) Context.getBean("helloWorld");

-> helloWorld라는 ID를 가진 Bean을 갖고싶으면 위와 같이 작성하면되고 해당 Bean의 주소값이 obj에 저장된다.

 


 

Main 함수에서 ApplicationContext를 생성하고 AppContext가 Dog, Cat ... Bean을 생성하고 필요에 따라 PetOwner에 

의존성을 주입시켜준다. 따라서 Main에서 ApplicationContext와 같은 SpringContainer을 먼저 생성해 줄 필요가 있다.

 


Dependency Injection을 사용함으로써 얻는 이점

- 의존성의 감소 : 소스코드 변경이 적어진다.

- 재사용성이 뛰어난 코드 : 소스코드 변경 없이 설정파일만 바꿔줘도 다른 코드와 호환이 된다.

- 테스트가 용이한 코드

- 가독성이 좋은 코드 

728x90
반응형