컨테이너란?

Servlet 컨테이너, EJB 컨테이너와 같은 컨테이너는 보통 인스턴스의 생명주기를 관리하며, 생성된 인스턴스들에게 추가적인 기능을 제공하도록하는 것이다.

컨테이너란 작성한 코드의 처리과정을 위임받은 독립적인 존재라고 생각하면 된다.

컨테이너는 적절한 설정만 되어있다면 프로그래머가 작성한 코드를 스스로 참조한 뒤 알아서 객체의 생성과 소멸을 컨트롤해준다.
(이를 IOC라 한다.)

Servlet 컨테이너는 Servlet의 생성, 생성 후 초기화, 서비스 실행, 소멸에 관한 모든 권한을 가지고 있다.

따라서 개발자들이 직접 Servlet을 생성하고 서비스하지는 않는다.

이처럼 Servlet 인스턴스에 대한 생명주기를 관리하는 기능을 가진다.

또한, Servlet 컨테이너의 web.xml을 보면 Servlet의 구현과는 별도로 각 JSP/Servlet에 대한 Security를 관리해주는 기능을 한다.


 스프링 컨테이너는 스프링 프레임워크의 핵심부에 위치하며, 종속객체 주입을 이용하여 애플리케이션을 구성하는 컴포넌트들을 관리한다.

스프링 컨테이너의 두 종류

1. 빈팩토리 BeanFactory (org.springframework.beans.factory.BeanFactory)

DI의 기본사항을 제공하는 가장 단순한 컨테이너

팩토리 디자인 패턴을 구현한 것. Bean(이하 빈) 팩토리는 빈을 생성하고 분배하는 책임을 지는 클래스

빈 팩토리가 빈의 정의는 즉시 로딩하는 반면, 빈 자체가 필요하게 되기 전까지는 인스턴스화를 하지 않는다 (lazy loading, 게으른 호출)


getBean()이 호출되면, 팩토리는 의존성 주입을 이용해 빈을 인스턴스화하고 빈의 특성을 설정하기 시작. 여기서 빈의 일생이 시작된다.


 BeanFactory factory = new XmlBeanFactory(new FileInputStream("bean.xml"));

 MyBean myBean = (Mybean) factory.getBean("myBean");


2. 어플리케이션 컨텍스트 ApplicationContext (org.springframework.context.factory.BeanFactory)


빈팩토리와 유사한 기능을 제공하지만 좀 더 많은 기능을 제공하는 어플리케이션 컨텍스트


빈팩토리보다 더 추가적으로 제공하는 기능

    국제화가 지원되는 텍스트 메시지를 관리해 준다.
    이미지같은 파일 자원을 로드 할 수 있는 포괄적인 방법을 제공해준다.
    리너스로 등록된 빈에게 이벤트 발생을 알려준다.

따라서 대부분의 애플리케이션에서는 빈팩토리보다는 어플리케이션 컨텍스트를 사용하는 것이 좋다.


가장 많이 사용되는 어플리케이션 컨텍스트 구현체

ClassPathXmlApplicationContext : 클래스패스에 위치한 xml 파일에서 컨텐스트 정의 내용을 읽어들인다.
FileSystemxmlApplicationContext : 파일 경로로 지정된 xml 파일에서 컨텐스트 정의 내용을 읽어들인다.
XmlWebApplicationContext : 웹 어플리케이션에 포함된 xml 파일에서 컨텐스트 정의 내용을 읽어들인다.




 ApplicationContext context = new ClassPathXmlApplicationContext("conf/bean.xml");

 MyBean bean = context.getBean("myBean");

 
빈 팩토리와 애플리케이션컨텍스트의 기능상의 차이점 말고 또 다른 차이점은 다음과 같다.

빈 팩토리 : 처음으로 getBean()이 호출된 시점에서야 해당 빈을 생성(lazy loading)

애플리케이션 컨텍스트 : 컨텍스트 초기화 시점에 모든 싱글톤 빈을 미리 로드한 후 애플리케이션 기동 후에는 빈을 지연 없이 얻을 수 있음(미리 빈을 생성해 놓아 빈이 필요할 때 즉시 사용할 수 있도록 보장)


출처: http://limmmee.tistory.com/13 [심플하게 개발]

'Programming > Spring' 카테고리의 다른 글

@Transactional  (0) 2018.05.15
POJO  (0) 2018.05.14
AspectJ Aop설정방법  (0) 2018.05.14
spring 사용이유?  (0) 2018.05.14
event.preventDefault() / event.stopPropagation()  (0) 2018.05.13

+ Recent posts