[정리] Spring IoC Container (2): IoC Container와 Bean 개요
Spring IoC Container and Beans 알아보기
이 글은 스프링 공식 문서를 기반으로 정리했습니다.
이번에는 스프링 프레임워크의 제어의 역전(IoC, Inversion of Control)의 구현에대해 대략적으로 다루어본다.
의존성 주입(DI)는 IoC의 특수한 형태로 객체가 argument(생성자, 팩토리 메서드를 통한) 또는 property(객체 인스턴스화 후, 팩토리 메서드 반환)통해서 의존성을 정의하는 방식이다.
의존성을 정의하는 방식
- Argument: 생성자나 팩토리 메서드를 통해 "나는 이게 필요해"라고 파라미터로 선언하는 방식
- Property: 객체가 일단 생성된 후에 세터 메서드 등을 통해 의존성을 주입받는 방식
정리하자면, 객체가 직접 의존 객체를 생성하지 않고 생성자나 세터 등을 통해 외부로부터 의존성을 전달받도록 정의하는 방신인 것. 이를 통해 객체는 자신의 의존성을 스스로 제어하는 권한을 컨테이너에 넘기게 된다.
IoC
IoC는 넓은 개념으로 이벤트 처리, 템플릿 메서드 패턴 등 다양한 방식으로 구현할 수 있다. 그중 객체의 의존 관계를 외부에서 설정해주는게 지금 설명하는 DI인 것이다.
IoC 컨테이너는 빈을 실제 생성 즉 인스턴스화 할 때 이런 의존성들을 주입한다. 이 과정이 빈이 클래스를 직접 생성하거나 Service Locator Pattern을 통해 빈 스스로 의존성의 인스턴스화나 위치를 제어하는 것의 반대(IoC란 이름의 근거)인것이다.
BeanFactory와 ApplicationContext
org.springframework.beans와 org.springframework.context 패키지는 스프링 프레임워크 IoC 컨테이너의 베이스를 이룬다.
BeanFactory 인터페이스는 모든 유형의 객체를 관리할 수 있는 향상된 설정 매커니즘을 제공한다.(advanced configuration mechanism)
ApplicationContext 인터페이스는 BeanFactory 서브 인터페이스고 추가적인 기능을 제공한다.
- Spring의 AOP와 쉬운 통합
- Message resource 핸들링(i18n 등)
- Event 발행
- 웹 애플리케이션을 위한
WebApplicationContext와 같은 Application-layer 특화 컨텍스트
요약하자면, BeanFactory는 설정 프레임워크와 기본적인 기능을 제공하고, ApplicationContext는 더 기업 환경에 특화된(Enterprise-specific) 기능을 추가로 제공해준다.
ApplicationContext는 BeanFactory의 완전한 상위 집합(superset)이며, 스프링 IoC 컨테이너 쪽 설명에서는 ApplicationContext만 이용되는거 참고하자.
여기서 상위 집합(superset)이라 부르는 이유는
ApplicationContext가BeanFactory의 모든 것을 포함하고 그 이상의 기능을 제공하기 때문에 **상위 집합(Superset)**이라고 부른다.
참고로 ApplicationContext 대신 BeanFactory를 사용하는 방법에 대한것은 BeanFactory API문서를 봐 주면 되겠다.
Bean
스프링에서 애플리케이션의 근간을 형성하고 스프링 IoC 컨테이너에 의해 관리되는 객체들을 '빈(bean)'이라고 부른다.
빈은 스프링 IoC 컨테이너에 의해 인스턴스화되고, 조립되며, 관리되는 객체. 만약 이렇게 IoC 컨테이너가 관리하는 객체가 아니라면 그냥 객체일 뿐 빈이 아니다. 빈과 빈들 간의 의존성은 IoC 컨테이너에 의해 사용되는 설정 메타데이터(configuration metadata)에 반영된다.