devlog

🌱Spring Framework : Dependency Injection 본문

Spring/이론

🌱Spring Framework : Dependency Injection

Dev-SeeOne 2020. 5. 18. 16:53

1. Dependency Injection

일반적으로 Java 프로그래밍에서 new 키워드를 이용하여 객체를 생성한다. 이러한 코드의 경우 객체간의 의존성이 높아 하나의 코드를 수정하게 되면 의존성이 있는 코드들 전체를 수정해야 하고 그럴 때마다 재컴파일 하는 과정이 필요하다.

 

Spring Framework 에서는 의존성을 줄이기 위해서 인터페이스를 활용한 객체 모델을 주로 사용한다. 또한 Container를 이용하여 Application에서 필요에 의해 객체를 생성하는 것이 아닌 Container가 필요한 인스턴스를 공급해 줌으로써 

객체사이의 의존성을 줄이고 객체사이의 의존 관계가 객체가 아닌 외부에 의해서 설정되는 이러한 구조를 Dependency Injection 줄여서 DI 라는 용어로 부른다.

 

 

 

2. Inversion of Control 

Inversion of Control , IoC는 DI 와 같은 개념으로 객체의 생성에서부터 의존관계 설정, 생명주기의 관리까지 모든 객체에 대한 제어권이 뒤바뀐 것을 의미한다. 

 

IoC는 정확히 말하자면 DI 보다는 좀 더 크고 포괄적인 개념으로 사용되며 다음과 같은 관계가 성립한다.

 

 

3. Dependency Injection 의 종류

Dependency Injection 은 다음과 같이 3가지 종류로 나뉘어진다.

 

  • Setter Injection 
    • Setter 를 이용한 Dependency Injection 
  • Constructor Injection
    • Constructor 를 이용한 Dependency Injection
  • Method Injection 

일반적으로 Spring Framework 에서는 Setter 과 Contructor 를 이용한 DI를 사용한다. 

 

 

4. Setter Injection 

클래스 사이의 의존관계를 Setter 메서드를 이용하여 설정한다. 

 

📃 Foo.java

class Foo {
	private Bar bar;
    
	public void setBar(Bar bar) {
		this.bar = bar;
	}
}

 

📃 Context.xml

<bean id="foo" class="Foo">
	<property name="bar" ref="bar"/>
</bean>

<bean id="bar" class="Bar"/>

 

만약 Setter의 파라미터가 여러개일 경우 여러개의 파라미터에 대한 값들을 모두 값을 전달해 주어야 한다. 이 때 name 을 통해 각 파라미터를 구분한다.

 

 

 

5. Constructor Injection 

클래스 사이의 의존 관게를 생성자를 이용하여 설정한다. 

 

📃 Foo.java

class Foo {
	private Bar bar;
    
	public void setBar(Bar bar) {
		this.bar = bar;
	}
}

📃 Context.xml

<bean id="foo" class="Foo">
	<constructur-arg ref="bar"/>
</bean>

<bean id="bar" class="Bar"/>

 

Setter Injection 과 마찬가지로 여러개의 파라미터가 생성자의 파라미터로 전달될 경우 각각의 파라미터들에 대해 모두 값이 전달되어야 하며, name 을 통해 각 파라미터를 구분한다.

 

Context.xml 을 작성할 때 작성되는 순서는 상관이 없으며, <bean> 태그 하나당 인스턴스 하나가 생성된다.

Comments