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에 무슨 장점이 있길래? 에 대한 정보는 다음 포스팅 참조!
참조
https://www.vojtechruzicka.com/field-dependency-injection-considered-harmful/
'Spring' 카테고리의 다른 글
[Spring] IntelliJ에서 Spring + 톰캣 연동하기 (0) | 2021.02.17 |
---|---|
[Spring Boot] JetBrains Java Trend Analysis - 2020 vs 2019 (0) | 2021.02.04 |
[Spring Boot] 1분만에 IntelliJ에서 spring-boot-devtools 설정하기 (0) | 2020.06.11 |
[Spring] 왜 Constructor Injection(생성자 주입)을 사용해야 할까? (0) | 2019.11.06 |
[Spring] DI(Dependency Injection)란? (0) | 2019.11.05 |
댓글