[Spring] IOC(Inversion Of Control): 제어 역전

Junseo Kim·2020년 1월 4일
0

IOC

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 컨테이너

IOC기능을 제공하는 컨테이너. Bean들을 담고있음
Bean 정의를 읽어들이고, Bean을 구성하고 제공.(Bean을 만들어주고, 엮어주고, 제공해줌)

BeanFactory

Bean의 생성과 설정, 관리를 맡고있음

ApplicationContext

BeanFactory를 상속받고 있기 때문에, BeanFactory와 같은 일을 한다고 볼 수 있다.

Bean

컨테이너 안에 들어있는 객체들. 컨테이너에 담겨있기 때문에, 사용하려면, 컨테이너에서 가져와야한다.

여러 annotaion을 사용하여 일반적인 객체를 bean으로 등록할 수 있다. 또한 Bean에 등록되어있는 객체들을 쉽게 주입받아 사용할 수 있다.

의존성 주입을 하기 위해서는 Bean이 되어야한다.
-> 의존성 주입은 bean끼리만 가능하다.(IOC 컨테이너 안에 들어 있는 객체들끼리만 의존성 주입을 해준다.)

spring이 bean의 의존성을 관리해준다. -> 필요한 의존성을 서로 주입해준다.(특정한 생성자를 보거나 annotation을 보고 주입해준다)

라이프사이클도 이용가능하다.

Bean의 scope

  • 싱글톤: 하나만 만들어서 사용
  • 프로토타입: 매번 다른 객체를 사용

객체를 Bean으로 등록할 때, 아무 annotation을 붙이지 않으면 Bean들이 싱글톤 scope로 등록된다. -> 애플리케이션 전반에서 스프링 IOC 컨테이너로부터 bean을 받아서 사용 시, 항상 같은 객체 -> 효율적이다(미리 컨테이너 안에 만들어 둔 하나의 객체를 사용하기 때문에, 메모리면이나 성능 최적화에 유리).

0개의 댓글