
Inversion of Control
한글로 번역하면 '제어의 역전'으로 변역이 가능한데, 정확히 어떤 제어의 역전을 의미하는 것일까요? 제어의 역전을 설명할 때 "Don't call us. We'll call you." - Hollywood Principle 라는 비유 표현을 자주 볼 수 있습니다. 필요하면 연락할테니 먼저 연락하지 말라는 뜻입니다.
일반적인 프로그램에서 객체의 생명주기는 개발자가 직접 관리합니다. 하지만, 스프링 프레임워크에서는 @Controller, @Service 같은 어노테이션을 붙여 객체를 선언하고, 이 객체가 언제 생성되고 소멸하는지는 신경쓰지 않습니다.
이것을 두고 제어권이 역전되었다고 표현합니다.
Dependency Injection
IoC가 프로그램 제어권의 역전이라면, DI는 무엇일까요? 이 둘은 절대 동일한 개념이 아닙니다. DI는 IoC를 구현하기 위해 사용하는 디자인 패턴으로, 객체의 의존관계가 외부에서 주입되는 것입니다.
public class A {
@Autowired
B b;
}
위에서 사용한 Autowired라는 어노테이션은 빈을 주입하는 역할을 합니다. 개발자는 B b;라는 선언문만 작성했을 뿐 객체를 생성하지는 않았습니다. 하지만, b를 이용한 동작을 작성해도 코드는 잘 동작하는데, 이는 스프링 컨테이너라는 곳에서 b에 객체를 주입했기 때문입니다.
위에서 "빈을 주입하는 역할" 이라는 표현을 했는데 Bean은 무엇일까요?
우리가 빈을 등록하면 Spring Application Context 안에 Bean이 싱글톤으로 등록되고, Spring Application Context의 여러 설정값이 클래스에 들어갑니다. 어떤 클래스는 Bean으로 등록해야하고/아니고 등록하는 것이 편하고/아니고에 대한 구분이 생겨나게 됩니다.
Spring Application Context 인터페이스를 통해 제공되는 스프링 컨테이너는 Bean 객체의 생성 및 Bean 들의 상호 의존성 관리를 담당합니다.