스프링 컨테이너는 내부에 존재하는 빈의 생명주기를 관리(빈의 생성, 관리, 제거 등)하며, 생성된 빈에게 추가적인 기능을 제공하는 것이다.
컨테이너는 Beanfactory와 ApplicationContext 두 종류의 인터페이스로 구현되어 있다.
빈 팩토리는 빈의 생성과 관계설정 같은 제어를 담당하는 IoC 오브젝트이고, 빈 팩토리를 좀 더 확장한 것이 애플리케이션 컨텍스트이다. 그래서 대부분의 경우에는 ApplicationContext를 사용한다. 그 이유는 ApplicationContext의 부가기능 때문이다.
- Application Context의 부가 기능
- MessageSource : 메시지 다국화를 위한 인터페이스
- EnvironmentCapable : 개발, 운영, 환경변수 등으로 나누어 처리하고, 애플리케이션 구동 시 필요한 정보들을 관리하기 위한 인터페이스
- ApplicationEventPublisher : 이벤트 관련 기능을 제공하는 인터페이스
- ResourceLoader : 파일, 클래스 패스, 외부 등 리소스를 편리하게 조회
자바에서는 객체를 생성하기 위해서는 new 생성자를 사용해야 한다. 그로 인해 애플리케이션에서는 수많은 객체가 존재하고 서로를 참조하게 된다. 하지만 객체 간의 참조가 많으면 많을수록 의존성이 높아지게 된다. 이는 낮은 결합도와 높은 캡슐화를 지향하는 객체지향 프로그래밍의 핵심과는 안 맞는 방식이다.
따라서, 객체 간의 의존성을 낮추어(느슨한 결합) 결합도는 낮추고, 높은 캡슐화를 위해 스프링 컨테이너가 사용된다.
스프링 컨테이너의 생성 과정은 크게 두 가지 방식있다. 이는 XML 기반 설정과 Java Config(Java 기반 설정) 방식이다.
1. XML 기반 설정 방식:
- 스프링 컨테이너를 생성하기 위해 ApplicationContext를 구현한 클래스를 이용
- XML 파일에 빈(Bean) 설정 정보를 작성.
- XML 파일에서 빈의 설정 정보를 읽어와 해당 객체들을 생성하고, 필요한 의존성을 주입.
- 컨테이너가 초기화될 때, XML 파일에서 정의한 빈들을 미리 생성하고 필요에 따라 빈을 가져와서 사용
- Java Config 방식:
- XML 파일 대신 자바 코드로 스프링 빈의 설정 정보를 작성
@Configuration
어노테이션을 이용하여 설정 클래스를 선언@Bean
어노테이션을 사용하여 빈 객체들을 정의하고, 필요한 의존성을 주입- 자바 설정 파일을 사용하여 ApplicationContext를 생성
- 컨테이너가 초기화될 때, Java Config 클래스에 정의한 빈들을 미리 생성하고 필요에 따라 빈을 가져와서 사용