객체지향 프로그래밍에서 어떤 객체에 의존한다는 것은, 다른 객체의 데이터나 기능을 사용(호출)하는 것으로 이해할 수 있다.
class A {
public void methodA();
}
class B {
A a = new A();
public void methodB(){
a.methodA();
}
}
위의 코드는 B라는 객체에서 A라는 객체를 생성하고 그 메소드를 실행한다. 정확히는 이를 B의 작업을 A에게 위임delegation한다고한다. 이 때 A의 메소드가 변경될 경우 B 또한 영향을 받을 수 있기 때문에 두 객체는 의존관계에 있다고 말한다.
Spring Framework은 자바 객체의 생성과 소멸 등 생명주기를 관리(BeanFactory)하고 생성된 객체에게 추가적인 기능을 부여(ApplicationContext)하기도한다.
이 때 위의 역할을 하는 주체를 우리는 컨테이너라고 부르고, 컨테이너에 의해 관리되는 자바 객체를 빈(Bean)이라고한다.
여담으로, 컨테이너와 빈은 나름대로 적합한 비유인 것이, 콩깍지(객체)안에 콩알(데이터와 기능)이 있고 그 콩들을 싣고(생성) 컨테이너에서 내리고(소멸) 콩들이 말라 죽지 않도록 적절히 온습도를 유지(관리)해준다고 생각할 수 있다.
위에서 언급하였듯 객체의 제어권이 개발자가 아닌 Spring 컨테이너에게 있다. 따라서 우리는 Spring Framework에서 의존 객체를 직접 만들어(new) 사용하지 않고 컨테이너에게 주입(Injection)받아 사용한다.
Image 출처
Bean을 등록하고 의존성 주입을 하는 방법은 따로 기술하지 않는다.
Inversion of Control 즉, 제어의 역전이다.
글자 그대로 개발자가 객체(Spring Bean)의 생명주기 및 의존성을 제어하는 것이 아닌, 컨테이너가 그 제어권을 갖게 되었을 때를 말한다.
그래서 스프링 컨테이너를 IoC 컨테이너라고 부르기도한다.