스프링 DI 이론 - IoC와 DI
스프링에서의 빈(bean)
POJO(Plain Old Java Object)는 오래된 방식의 간단한 자바 오브젝트를 의미하고, 이를 통해 알 수 있는 것은 스프링에서의 bean은 자바 객체를 그대로 씀으로써 단순하고 독립적이라는 특성이 있다는 점이다. 따라서 기존 EJB가 가지는 복잡한 규칙을 단순하게 가자는 데에서 출발하였다.
스프링에서의 bean은 Spring container가 관리하는 객체 즉 bean 저장소를 의미하고, 따라서 bean을 저장 및 관리(생성, 소멸, 연결) 해 준다. Spring container에는 다음의 두 가지 주요 인터페이스가 있다.
①BeanFactory - Bean 생성 및 연결 등의 기본 기능을 정의 한 인터페이스
②ApplicationContext - BeanFactory를 확장해서 여러 기능을 추가 정의 한 인터페이스
다음의 표는 ApplicationContext의 종류들이다.
AC의 종류 | XML | Java Config |
non-Web | GenericXmlApplicationContext | AnnotationConfigApplicationContext |
Web | XmlWebApplicationContext | AnnotationConfigWebApplicationContext |
IoC(Inversion of Control)와 DI(Dependency Injection)
IoC(Inversion of Control)는 제어의 역전 즉, 제어의 흐름을 전통적인 방식과 다르게 뒤바꾸는 것을 의미한다. 의미로는 크게 와닿지 않기 때문에 아래 전통적인 방식과의 비교를 통해 알아본다.
Car car = new Car();
car.turboDrive();
void turboDrive(){
engine = new TurboEngine();
engine.start();
}
위 코드와 같이 기존에 사용하던 방식은 turboDrive() 메서드를 호출하고 turboDrive() 메서드 처리 후 되돌아오는 방식이었다.
Car car = new Car();
car.drive(new TurboEngine());
void drive(Engine engine){
engine.start();
}
위 코드와 같이 drive() 메서드에서 반대로 new TurboEngine()을 호출하고 있음을 알 수 있다. 이와 같이 제어의 흐름이 뒤바뀐 것이 바로 IoC라고 할 수 있다. IoC 방식을 사용하는 이유는 drive() 메서드가 변하지 않는 코드가 되고, 이를 호출해서 사용하는 사용자 코드(new TurboEngine 부분)만 변경해주면 되기 때문이다.
DI(Dependency Injection)는 위 코드에서 new TurboEngine()을 통해 drive() 메서드의 매개변수로 주입되는데, 이처럼 사용할 객체를 외부에서 주입받는 것을 의존성 주입(DI)라고 한다.