IoC(Inversion of Control)

IoC는 Inversion of Control의 약자로 제어의 역전이라는 의미이다. 기존에는 프로그래머가 직접 Object를 생성하고 관리하였으나 IoC에서는 프로그래머가 관리하지 않는다. 모든 제어 권한을 자신이 아닌 다른 대상에게 위임하기 때문이다.

스프링 IoC 컨테이너('스프링 컨테이너' 라고도 한다)는 스프링 애플리케이션에서 애플리케이션에 존재하는 객체를 생성하고 의존 관계를 주입하는 일을 담당한다. 스프링 컨테이너가 생성하고 관리하는 애플리케이션 객체들을 Bean이라고 부른다.

의존 관계를 만들고 주입하는 책임은 애플리케이션의 객체가 아닌 스프링 컨테이너에 있기 때문에 DI를 제어의 역전(IoC)이라고도 부른다. 그리고 객체를 생성 ~ 생명주기 관리를 컨테이너가 도맡아서 하게 된다.

스프링은 기본적으로 별다른 설정을 하지 않으면 내부에서 생성하는 빈 오브젝트를 모두 싱글톤으로 만든다.


BeanFactory

BeanFactory는 스프링의 IoC를 담당하는 핵심 컨테이너이다. BeanFactory를 직접 사용할 일은 거의 없으며, 부가기능이 포함된 ApplicationContext를 사용한다.


 

ApplicationContext

applicationContext는 BeanFactory를 상속받아 확장한 IoC 컨테이너이며 BeanFactory 이외의 여러 가지 부가기능을 사용할 수 있다.


Dependency Injection

DI는 말 그대로 의존적인 객체를 직접 생성하거나 제어하는 것이 아니라, 특정 객체에 필요한 객체를 외부에서 결정해서 연결시키는 것을 의미한다. 

인터페이스에 대해서만 의존관계를 만들어두면 인터페이스 구현 클래스와의 관계는 느슨해지면서 변화에 영향을 덜 받는다(결합도가 낮음).의존관계란 한쪽의 변화가 다른 쪽에 영향을 주는 것인데, 인터페이스를 통해 의존 관계를 제안해주면 그만큼 변화로부터 자유로워질 수 있다.

인터페이스를 통해 설계 시점에 느슨한 의존관계를 갖는 경우에는 런타임 시에 사용할 오브젝트가 어떤 클래스로 만든 것인지 미리 알 수 없다. 프로그램이 시작되고 오브젝트가 만들어지고 나서 런타임 시에 의존 관계를 맺는 대상을 의존 오브젝트라고 한다.

즉, 의존 관계 주입은 의존 오브젝트와 그것을 사용할 주체 오브젝트를 런타임 시에 연결해주는 작업을 말한다.

의존관계 주입을 사용하면 정적인 클래스 의존관계를 변경하지않고, 동적인 객체 인스턴스 의존관계를 쉽게 변경할 수 있다.

의존관계 주입(DI)의 핵심은 설계 시점에 알지 못했던 두 오브젝트의 관계를 맺도록 도와주는 제3의 존재가 있다는 것이다. 여기서 제 3의 존재는 바로 애플리케이션 컨텍스트, 빈 팩토리, IoC 컨테이너라고 볼 수 있다.

스프링의 DI를 사용하면 "기존 코드를 전혀 손대지 않고, 설정만으로 구현 클래스를 변경"할 수 있다.

 

참고 : IoC - spring (gitbook.io)

 

IoC

 

dahye-jeong.gitbook.io

 

+ Recent posts