Inversion Of Control: 제어권이 역전되었다. (의존 관계 주입)
어떤 객체가 사용할 객체(의존관계인 객체)를 직접 선언하여 사용하는 것이 아니라, 어떤 방법을 사용하여(ex. 생성자)사용하여 주입 받아 사용하는 것
/*
일반적인 제어권: 자기가 사용할 의존성은 자기가 만들어서 사용
*/
@Service
public class CarService {
private CarRepository carRepository = new CarRepository();
}
/*
Inversion Of Control
다른 누군가가 의존성을 밖에서 준다.(제어권의 역전)
의존성을 주입해주는 일:Dependency Injection(일종의 IOC)
*/
@Service
public class CarService {
// CarRepository를 사용은 하지만 만들지는 않는다.
private CarRepository carRepository;
/*
생성자를 통해서 받아온다.
따라서 의존성을 관리하는 일은 CarService가 하는 일이아니다. 누군가 밖에서 해주는 것이다.
*/
public CarService(CarRepository carRepository){
this.carRepository = carRepository;
}
}
IOC기능을 제공하는 컨테이너. Bean들을 담고있음
Bean 정의를 읽어들이고, Bean을 구성하고 제공.(Bean을 만들어주고, 엮어주고, 제공해줌)
Bean의 생성과 설정, 관리를 맡고있음
BeanFactory를 상속받고 있기 때문에, BeanFactory와 같은 일을 한다고 볼 수 있다.
컨테이너 안에 들어있는 객체들. 컨테이너에 담겨있기 때문에, 사용하려면, 컨테이너에서 가져와야한다.
여러 annotaion을 사용하여 일반적인 객체를 bean으로 등록할 수 있다. 또한 Bean에 등록되어있는 객체들을 쉽게 주입받아 사용할 수 있다.
의존성 주입을 하기 위해서는 Bean이 되어야한다.
-> 의존성 주입은 bean끼리만 가능하다.(IOC 컨테이너 안에 들어 있는 객체들끼리만 의존성 주입을 해준다.)
spring이 bean의 의존성을 관리해준다. -> 필요한 의존성을 서로 주입해준다.(특정한 생성자를 보거나 annotation을 보고 주입해준다)
라이프사이클도 이용가능하다.
객체를 Bean으로 등록할 때, 아무 annotation을 붙이지 않으면 Bean들이 싱글톤 scope로 등록된다. -> 애플리케이션 전반에서 스프링 IOC 컨테이너로부터 bean을 받아서 사용 시, 항상 같은 객체 -> 효율적이다(미리 컨테이너 안에 만들어 둔 하나의 객체를 사용하기 때문에, 메모리면이나 성능 최적화에 유리).