본문 바로가기

프레임워크/스프링

Spring_내용설명_02) Spring Framework의 Bean과 Container

# Spring Bean

 Spring의 Bean을 간단히 정의한다면 그저 단순한 객체이다. 
다른점이 있다면 Spring Bean은 Spring에 의해서 관리받는 객체라는 점이다. 
(* 주의 : Java의 Bean은 데이터를 표현하는 VO이니 두 가지를 혼동하면 안된다.) 
Spring으로부터 이러한 관리를 받기때문에 여러가지 특징이 생기는데 특징은 다음과 같다.

* Bean 특징

- 스프링에 의해 의존성이 관리된다.(의존성에 대한 설명은 앞선 포스터에 있습니다.)

- 스코프를 특별히 지정하지 않는한 싱글톤.

- Bean 으로 선언되어 의존성을 주입 받을 Class 또한 같은 이름의 클래스를 하나만 만들 수 있다. 

 첫째로, 앞서 말했듯이 Spring의 특수한 장치로 선언된 클래스가 의존하게 될 객체를 사용자가 아닌 Spring 자체에서 제공해주게 됩니다. 
 둘째로, 특별한 선언을 하지 않는 경우 해당 객체는 싱글톤으로 만들어져서 프로세스가 실행되는 동안 단 하나의 객체만 생성되고 그 메모리를 공유하게 됩니다. 또한 어노테이션 등을 통해서 프로토타입(매번 새로운 객체를 생성하는 것)등과 같은 다른 타입의 객체로도 선언이 가능합니다.
 셋째로, Spring에 의해서 의존성을 주입받는 클래스는 동일한 명의 클래스를 만들 수 없게(지키지 않을 시 에러 발생) 됩니다.

 위 세가지 특징은 큰 연관성이 없는듯 하지만 실질적으로는 Spring에 의해 의존성이 관리 되기 때문에 유일한 클래스 명을 가지는 객체를 생성하여 어느 장소에서 호출돼든 Bean의 생애주기 동안 메모리를 공유할 수 있는 싱글톤으로 만들 수 있는 것입니다. 


 
# Spring Container

 위에서 설명 한것처럼 Spring은 Bean을 관리하는 특수한 장치를 가지고 있습니다. 이 장치의 이름이 바로 Spring Container 입니다. Spring Container 는 Bean이 설정된 소스(XML, Annotations, Java Code 등)로 부터 Bean 정의를 읽어들이고, Bean을 구성하고 제공하는 역할을 합니다. 이러한 Spring Container의 종류로는 BeanFactory와 이를 상속받은 ApplicationContext 가 있습니다.

BeanFactory

 Container의 관리를 받기 위해서는 객체가 몇몇 지정된 어노테이션을 사용해야 하는데 이러한 어노테이션이 사용될 때 최상위에서 구현 받게 되는 인터페이스가 BeanFactory 입니다.

ApplicationContext

 마찬가지로 BeanFactory를 상속 받아 BeanFactory와 비슷한 역할을 하지만 그외에 메세지 소스 처리, 리소스 로딩, 이벤트 발행 등 추가적인 기능을 가지고 있습니다.

 정리해보면 BeanFactory는 외형적인 틀과 기본적인 기능을 ApplicaionContext는 거기에 엔터프라이즈 성향의 기능이 추가된 형태입니다.