본문 바로가기
Spring

[Spring] Spring은 DI를 어떻게 지원할까?

by 노력남자 2019. 11. 6.
반응형

Spring은 DI를 어떻게 지원할까?

 

Spring하면 POJO, IOC/DI, AOP, PSA 를 특징으로 갖는 프레임워크라고 한다. 그 중 Spring에서는 DI를 지원하기 위해 IOC를 사용한다.

 

 

IOC(Inversion of Control)이란?

 

개발자가 프로그램의 흐름을 제어하지 않고 프레임워크가 프로그램의 흐름을 주도하는 것을 말한다.

 

스프링에선 이 개념을 Spring DI 컨테이너를 이용해 빈 생명주기 관리, 의존성 주입 등을 도맡아 처리한다.

 

* IOC 컨테이너라고도 하는데 IOC가 내포하는 범위가 너무 넓어 DI 컨테이너라고 부른다고 한다.

 

 

Spring DI 컨테이너가 DI를 제공하는 방법

 

DI 컨테이너가 DI를 제공하는 방법엔 @Autowired 어노테이션을 붙히는 방법, XML에 Bean을 명세하는 방법 2가지가 있다. XML 방식은 요즘 잘 사용하지 않기 때문에 @Autowired 방식만 설명한다. 

 

Spring DI 컨테이너는 Constructor Injection(생성자 주입), Setter Injection(세터 주입), Field Injection(필드 주입) 3가지 방법으로 DI를 제공한다.

 

1. Constructor Injection(생성자 주입) 4.x 이상 Documentation에서 추천 

   * 4.3 이상일 경우 단일 생성자에 @Autowired 생략가능

 

public class SpellChecker { 
	private TextDictionary textDictionary;
	private VoiceDictionary voiceDictionary;
     
	@Autowired
	public SpellChecker(TextDictionary t, VoiceDictionary v) {
		this.textDictionary = t;
		this.voiceDictionary = v;
	}     
}

 

2. Setter Injection(세터 주입) 3.x Documentation에서 추천

 

public class SpellChecker { 
	private TextDictionary textDictionary;
	private VoiceDictionary voiceDictionary;
     
	@Autowired
	public void setTextDictionary(TextDictionary t) {
		this.textDictionary = t;
	}
    
	@Autowired
	public void setVoiceDictionary(VoiceDictionary v) {
		this.voiceDictionary = v;
	}     
}

 

3. Field Injection(필드 주입)

 

public class SpellChecker { 
	@Autowired
	private TextDictionary textDictionary;
    
	@Autowired
	private VoiceDictionary voiceDictionary;     
}

 

마치며

 

평소에 개발할 때 Field Injection이 코딩하기 편하고 가독성도 좋아 썼는데 이번 포스팅 글을 위해 구글링해보니 Constructor Injection을 추천한다고 한다. 

 

도대체 왜? Constructor Injection에 무슨 장점이 있길래? 에 대한 정보는 다음 포스팅 참조!

 

[Spring] 왜 Constructor Injection(생성자 주입)을 사용해야 할까?

왜 Constructor Injection(생성자 주입)을 사용해야 할까? 이전 포스팅에서 Field Injection, Setter Injection 대신 Constructor Injection을 사용해야한다고 했는데 어떤 장점이 있어서 사용해야 하는지 알아보..

effortguy.tistory.com

 

 

참조

 

https://www.vojtechruzicka.com/field-dependency-injection-considered-harmful/

반응형

댓글