IoC란 Inversion of Control의 약자로 해석하자면 제어의 역전이다.
제어의 역전은 제어권이 뒤 바뀌었다는 뜻이다.
이말은 기존의 제어방식을 뒤집었다는 말이 된다.
그렇다면 기존의 방식은 어떠했는가 살펴보자.
자바가 등장하고 자바 기반의 어플리케이션이 개발되던 초기에는 자바 객체를 생성하고 객체간의 의존관계를 연결하는 등의 제어권을 개발자가 직접 가지고 있었다고 한다.
그러나 서블릿, EJB가 등장하면서 개발자가 독점적으로 가지고 있던 제어권이 서블릿과 EJB를 관리하는 외부의 컨테이너로 넘어갔다.
객체의 생성부터 생명주기의 관리까지 모든 객체에 대한 제어권이 바뀐 것을 IoC, 제어의 역전이라 하는것이다.
모든 작업을 사용하는 쪽에서 제어하게 되면서 IoC컨테이너에서 제어하게 된다.
기본적으로 컨테이너는 객체를 생성하고 객체간의 의존성을 이어주는 역할을 한다.
BeanFactory 인터페이스는 IoC컨테이터의 기능을 정의하고 있는 인터페이스이다.
Bean의 생성 및 의존성 주입, 생명주기(lifecycle) 관리 등의 기능을 제공한다.
여기서 Bean이란 IoC컨테이너에 의해 생성되고 관리되는 객체를 의미한다.
BeanFactory 인터페이스를 상속받는 ApplicationContext는 BeanFactory가 제공하는 기능 외에 AOP, 메세지처리, 이벤트 처리 등의 기능을 제공한다.
모든 ApplicationContext 구현체는 BeanFactory의 기능을 모두 제공하므로, 특별한 경우를 제외하고는 ApplicationContext를 사용하는 것이 바람직하다.
Spring프레임워크에서는 다수의 ApplicationContext를 제공한다.
ClassPathXmlApplicationContext를 생성하는 예시를 보자.
ApplicationContext context = new ClassPathXmlApplicationContext("config/bean.xml");
MyBean bean = context.getBean("myBean");
DI를 통해 IOC를 구현한다.
위의 그림처럼 IoC(Inversion of Control)를 구현하는 방법으로 DL, DI 2가지 방밥이 있다.
컨테이너에서 제공하는 API를 이용해 사용하고자 하는 빈(Bean)을 저장소에서 Lookup하는 것을 말한다.
각 객체간의 의존성을 컨테이너가 자동으로 연결해주는 것으로 개발자가 빈(Bean) 설정파일에 의존관계가 필요한 정보를 추가해주면 컨테이너가 자동적으로 연결해준다.