이번 장에서는 스프링에서 중요한 개념인 의존성 주입(DI)에 대해 알아보고,
의존성을 주입하는 세가지 방법, 스프링 IoC 컨테이너, 빈의 의미와 등록방법 에 대해 알아보고자 한다.
의존 관계 주입(Dependency Injection)이라고도 하며, 어떤 객체가 사용하는 의존 객체를 직접 만들어(new 연산자) 사용하는게 아니라, 주입 받아서 사용하는 방법.
아래 코드는 개발자가 직접 new연산자를 사용하여 직접 객체를 생성하여 코드를 제어하는 코드이다.
//배터리 일체형
public Class ElectronicToy1 {
private Battery battery;
public ElectronicToy1(){
battery = new Battery();
}
}
아래 코드는 Battery라는 객체가 스프링 컨테이너에게 관리되고 있는 Bean이라면 @Autowired를 통해 객체를 주입받는 코드이다.
//배터리 분리형
public class ElectronicToy2 {
@Autowired
private Battery battery;
그러면 이와 같이 의존성 주입을 사용하는 이유는 뭘까?
1) 생성자 주입
public class TestService {
private TestRepository testRepository;
//스프링 4.3 부터는 클래스의 생성자가 하나이고,
//그 생성자로 주입 받을 객체가 빈으로 등록 되어 있다면
//생성자 주입에서 @Autowired를 생략할 수 있음.
@Autowired
public TestService(TestRespository testRepository) {
this.testRepository = testRepository;
}
}
2) 필드 주입
public class TestService{
@Autowired
private TestRepository testRepository;
}
3) Setter 주입
public class TestService{
private TestRepository testRepository;
@Autowired
public void setTestRepository(TestRepository testRepository){
this.testRepository = testRepository;
}
}
Spring framework reference에서 권장하는 방법은 2번째 생성자를 통한 주입이다.
생성자를 사용하는 방법이 좋은 이유는 필수적으로 사용해야하는 의존성 없이는 인스턴스를 만들지 못하도록 강제할 수 있기 때문이다.
*POJO : 주로 특정 자바 모델이나 기능, 프레임워크를 따르지 않는 순수Java Object를 지칭 (getter/ setter)
우선 스프링은 경량 컨테이너로 객체 생성, 소멸과 같은 Life Cycle을 관리하며 스프링 컨테이너로부터 필요한 객체를 얻을 수 있다.
스프링 컨테이너에 의해서 자바 객체가 만들어지게 되면 이 객체를 스프링은 빈(Bean)이라고 부른다.
스프링 빈과 자바 일반 객체와의 차이점은 없고 스프링 컨테이너에 의해 만들어진 객체를 스프링 빈이라고 부른다.
@Component, @Service, @Controller, @Repository, @Bean, @Configuration 등으로 필요한 빈들을 등록하고 필요한 곳에서 @Autowired를 통해 주입받아 사용한다.
참고자료
https://jjunii486.tistory.com/84 ,
https://atoz-develop.tistory.com/entry/Spring-%EC%9D%98%EC%A1%B4%EC%84%B1-%EC%A3%BC%EC%9E%85DI-Dependency-Injection%EC%9D%98-%EC%84%B8%EA%B0%80%EC%A7%80-%EB%B0%A9%EB%B2%95 ,
https://cbw1030.tistory.com/54 ,
https://devlog-wjdrbs96.tistory.com/165 ,
https://siyoon210.tistory.com/120