제어의 역전(IoC)
- 제어의 역전이라는 개념.
일반적으로 프로그램의 흐름은.
- main()메소드와 같이 시작지점에서..
- 사용할 오브젝트를 결정하고..
- 오브젝트를 생성하고..
- 메소드를 호출하고..
- 메소드안에서 사용할 것을 결정하고 호출 하는 식의 반복..
으로 이루어 진다.
제어의 역전은 이러한 흐름의 개념을 거꾸로 뒤집는 것이다.
제어의 역전에서는 오브젝트가 자신이 사용할 오브젝트를 스스로 선택하지 않고, 생성하지도 않는다. 또 자신이 어디서 만들어지고 어디서 사용되는지도 알 수 없다.
모든 제어 권한을 자신이 아닌 다른 대상에게 위임한다.(서블릿또한 서블릿 컨태이너에 의해 관리되므로 제어의 역전 개념이 들어가 있다.)
- 스프링 IoC 스프링에서는 오브젝트 팩토리를 이용해서 IoC를 한다. 스프링이 직접 제어권을 가지고 직접 만들고 관계를 부여하는 오브젝트(대상)이 Bean이라고 불리며 BeanFactory에서 빈의 생성, 관계 설정등과 같은 제어를 담당한다.
의존성 주입(DI)
말그대로 의존성이 있는 오브젝트를 외부로 부터 제공 받는다는 의미이다.
의존성이 있다는 것은 예를들면, A가 B에 의존하고 있다고 하면 A는 B의 변화 상태에 따라 영향을 받는 다는 의미이다.
스프링 DI는 세가지 조건을 충족해야 한다.
- 클래스 모델이나 코드에는 런타임 시점의 의존관계가 드러나지 않는다. 그러기 위해서는 인터페이스에만 의존하고 있어야 한다.
- 런타임 시점의 의존관계는 컨테이너나 팩토리 같은 제3의 존재가 결정한다.
- 의존관계는 사용할 오브젝트에 대한 레퍼런스를 외부에서 제공(주입)해줌으로써 만들어진다.
의존관계 검색은 꼭 스프링의 bean일 필요는 없지만 애플리캐이션 기동시점에서 한번은 관계검색을 해줘야한다.
의존관계 주입은 꼭 스프링의 baen이어야 한다. 컨테이너가 관리해주기 위함이다.
위에 스프링IoC에서 BeanFactory가 스프링 Bean을 생성할때 DI를 같이 관리 해준다.