[Spring] 의존성 주입(DI, Dependency Injection)의 세가지 방법
[Spring] 의존성 주입(DI, Dependency Injection)의 세가지 방법
Spring은 @Autowired 애노테이션을 이용한 다양한 의존성 주입 방법을 제공한다.
@Autowired 애노테이션은 Spring에게 의존성을 주입하라는 지시자 역할로 쓰이는데 생성자, 필드, 세터에 붙일 수 있다.
🚨 Spring IoC 컨테이너에 의한 의존성 주입은 빈(Bean) 끼리만 가능하다.
1. 생성자 주입
@Component
public class SampleController {
private SampleRepository sampleRepository;
@Autowired
public SampleController(SampleRepository sampleRepository) {
this.sampleRepository = sampleRepository;
}
}
이렇게 생성자에 @Autowired 애노테이션을 붙여 의존성을 주입받을 수 있다.
Spring 4.3부터는 클래스의 생성자가 하나이고 그 생성자로 주입받을 객체가 빈으로 등록되어 있다면 생성자 주입에서 @Autowired를 생략할 수 있다.
2. 필드 주입
@Component
public class SampleController {
@Autowired
private SampleRepository sampleRepository;
}
변수 선언부에 @Autowired 애노테이션을 붙인다.
3. Setter 주입
@Component
public class SampleController {
private SampleRepository sampleRepository;
@Autowired
public void setSampleRepository(SampleRepository sampleRepository) {
this.sampleRepository = sampleRepository;
}
}
Setter 메소드에 @Autowired 애노테이션을 붙인다.
이 세개의 코드는 모두 동일하게 SampleController에 SampleRepository를 주입하도록 한다.
4. 생성자, 필드, Setter 주입 중 어떤 방법을 택할 것인가?
Spring framework reference에서 권장하는 방법은 생성자를 통한 주입이다.
생성자를 사용하는 방법이 좋은 이유는 필수적으로 사용해야하는 의존성 없이는 인스턴스를 만들지 못하도록 강제할 수 있기 때문이다.
SampleController가 SampleRepository 없이는 제대로 동작할 수 없다면 SampleController 입장에서 SampleRepository는 반드시 있어야 하는 객체이다.
그것을 강제할 수 있는 가장 좋은 방법이 생성자 주입 방법을 쓰는것이다.
5. 필드, Setter 주입 방법의 필요성
📝 순환 참조(Circular Dependency)
A가 B를 참조하고 B가 A를 참조하는 상태
A 클래스와 B 클래스가 순환 참조 관계이고 둘 다 생성자 주입을 사용한다면 A와 B중 어떤 인스턴스도 생성할 수 없고 결과적으로 어플리케이션이 실행조차 되지 않는다.
가급적이면 순환 참조를 피하는게 좋지만 어쩔수 없는 상황이라면 필드나 setter 주입 방법을 사용할 수 있다.
References
인프런 - 백기선님의 예제로 배우는 스프링 입문(개정판)
'Spring Framework > Spring Core' 카테고리의 다른 글
[Spring] 빈을 설정하는 3가지 방법 - XML, JAVA, Component Scan (0) | 2021.04.21 |
---|---|
[Spring] 왜 자바 객체를 IoC 컨테이너의 빈으로 만들까? (0) | 2021.04.21 |
[Spring] 스프링 PSA (0) | 2021.04.21 |
[Spring] 스프링 AOP 개념 이해 및 적용 방법 (0) | 2021.04.21 |
[Spring] 스프링 빈(Bean)의 개념과 생성 원리 (0) | 2021.04.21 |
[Spring] 스프링 예제 PetClinic 프로젝트 분석 및 기능 변경 (0) | 2021.04.21 |
[Spring] 스프링 예제 프로젝트 PetClinic 빌드 및 실행하기 (0) | 2021.04.21 |
spring websocket (polling, Handshake 과정, sockjs, webSocketHandler, 예제) (0) | 2021.03.23 |