컨테이너란, 보통 인스턴스의 생명주기를 관리, 생성된 인스턴스들에게 추가적인 기능을 제공하는 것이라고 한다.
즉, 컨테이너란 개발자가 작성한 코드의 처리과정을 위임받은 독립적인 존재라고 생각할 수 있다.
컨테이너는 적절한 설정만 되어 있따면 누구의 도움없이 프로그래머가 작성한 코드를 스스로 참조한 뒤 알아서 객체의 생성과 소멸을 컨트롤한다.
Servlet 컨테이너는 Servlet의 생성, 생성 후 초기화, 서비스 실행, 소멸에 대한 모든 권한을 가지고 있다.
개발자들이 직접 Servlet을 생성하고 서비스하지 않는다.
이처럼 Servlet 인스턴스에 대한 생명주기를 관리하는 기능을 가진다.
또한 Servlet 컨테이너의 web.xml을 보면 JSP/Servlet 접근 권한에 대한 추가적인 서비스도 지원하고 있다.
이는 Servlet의 구현과는 별도로 각 JSP/Servlet에 대한 Security를 관리해주는 기능을 한다.
스프링 컨테이너는 스프링 프레임워크의 핵심부에 위치하며, 종속 객체 주입을 이용하여 애플리케이션을 구성하는 컴포넌트들을 관리한다.
다시 말해 프로그래머가 작성한 코드는 컨테이너를 사용함으로써 프로그래머의 손을 떠나 컨테이너의 영역으로 떠난다.
스프링 프레임워크 또한 객체에 대한 생성 및 생명주기를 관리할 수 있는 기능을 제공하고 있다.
IoC 컨테이너는 객체의 생성을 책임지고, 의존성을 관리한다.
POJO의 생성, 초기화, 서비스, 소멸에 대한 권한을 가진다.
개발자들이 직접 POJO를 생성할 수 있지만 컨테이너에게 맡긴다.
(**POJO(Plain Old Java Object)란? 주로 특정 자바 모델이나 기능, 프레임워크를 따르지 않는 Java Object를 지칭한다.Java Bean 객체가 대표적이다.간단하게 getter / setter를 생각하면 될 것 같다.
BeanFactory 계열의 인터페이스만 구현한 클래스는 단순히 컨테이너에서 객체를 생성하고 DI를 처리해주는 기능만을 제공한다.
Bean을 등록, 생성, 조회, 반환 관리한다.
팩토리 디자인 패턴을 구현한 것으로 BeanFactory는 빈을 생성하고 분배하는 책임을 지는 클래스이다.
Bean Factory가 Bean의 정의는 즉시 로딩하는 반면, Bean 자체가 필요하기 전까지는 인스턴스화 하지 않는다.
Bean을 조회할 수 있는 getBean() 메소드가 정의되어 있다.
그러나 잘 사용하지 않는다고 한다.
스프링을 사용하는 이유는 컨테이너 뿐 아니라 스프링이 제공하는 다양한 부가 기능 때문이다.
그렇기 때문에 ApplicationContext를 주로 사용한다.
BeanFactory와 유사한 기능을 제공하지만 좀 더 많은 기능을 제공하는 애플리케이션 컨텍스트이다.
우선, Bean을 등록, 생성, 조회, 반환 관리하는 기능은 BeanFactory와 같다.
그러나, BeanFactory보다 더 추가적으로 제공하는 기능이 있다.
국제화가 지원되는 텍스트 메시지를 관리해준다.
이미지 같은 파일 자원을 로드할 수 있는 포괄적인 방법을 제공해준다.
리스너로 등록된 빈에게 이벤트 발생을 알려준다.
따라서 대부분의 Application에서는 BeanFactory보다는 ApplicationContext를 사용하는 것이 좋다.
ClassPathXmlApplicationContext
클래스패스에 위치한 xml 파일에서 컨텍스트 정의 내용을 읽어들인다.
FileSystemXmlApplicationContext
파일 경로로 지정된 xml 파일에서 컨텍스트 내용을 읽어들인다.
XmlWebApplicationContext
웹 어플리케이션에 포함된 xml 파일에서 컨텍스트 정의 내용을 읽어들인다.
GenericXmlApplicationContext
xml 파일을 설정 정보로 사용하는 스프링 컨테이너 구현 클래스로, 독립형 어플리케이션을 개발할 때 사용된다.
AnnotationConfigApplicationContext
그루비 언어로 작성된 설정 정보를 사용하는 스프링 컨테이너로, 독립형 어플리케이션을 개발할 때 사용된다.
AnnotationConfigWebApplicationContext
웹 어플리케이션을 개발할 때 사용하는 스프링 컨테이너로 자바 코드를 설정 정보롤 사용한다.
처음으로 getBean()이 호출된 시점에서야 해당 빈을 생성(Lazy Loading, 게으른 호출)
컨테스트 초기화 시점에 모든 싱글톤 빈을 미리 로드한 후 애플리케이션 가동 후에는 Bean을 지연없이 얻을 수 있다.
미리 Bean을 생성해 놓아 빈이 필요할 때 즉시 사용할 수 있도록 한다.
Inversion of Control의 약자로, 제어권의 역전을 의미한다.
컨테이너를 설명한 것처럼 기존 자바 기반으로 애플리케이션을 개발할 때 자바 객체를 생성하고 서로 간의 의존 관계를 연결시키는 작업에 대한 제어권이 보통 개발되는 애플리케이션에 있습니다. 하지만 Servlet Contatiner, EJB Container에게 제어권이 넘어가서 객체의 생명주기를 Container들이 전담하게 됩니다. 다시 한번 말해, 제어의 역전이란 인스턴스 생성부터 소멸까지 인스턴스 생명주기 관리를 개발자가 아닌 컨테이너가 대신 해준다는 의미입니다.
자바 빈
데이터를 표현하는 것을 목적으로 하는 자바 클래스
컴포넌트와 비슷한 의미
클래스에는 값을 저장하는 속성필드, get, set 메소드, 기본 생성자들을 포함
스프링 빈
스프링이 제어권을 가지고 직접 만들고 관계를 부여하는 오브젝트