Study/Spring Framework

[Spring] Spring Container 개념

jonghne 2023. 10. 18. 19:41

Spring Container란 ?

스프링 컨테이너(Spring Container)는 스프링에서 제공하는 DI 컨테이너로, 스프링 컨테이너가 관리하는 자바 객체인 스프링 빈(Bean)의 생성, 연결, 실행 등 모든 생명 주기를 관리하는 역할을 한다.

 

스프링 컨테이너는 스프링 빈을 컨테이너에 등록하고 DI 받아서 사용하므로, 역할과 책임을 분리하게 되고 변경에 용이한 애플리케이션을 개발할 수 있는 장점이 있다. 

 

Spring Container의 종류

스프링 컨테이너는 BeanFactory, ApplicationContext 인터페이스가 있고, 주로 ApplicationContext를 스프링 컨테이너라고 한다. (BeanFactory 인터페이스를 구현한 클래스로 다양한 편의기능이 포함되어있음)

BeanFactory

스프링 컨테이너의 최상위 인터페이스로, 스프링 빈을 관리하고 조회하는 기본적인 역할을 담당한다.

스프링 컨테이너에서 빈(Bean)을 조회하는 getBean() 메소드 또한 BeanFactory 인터페이스에서 제공된다.

 

 

ApplicationContext

최상위 인터페이스인 BeanFactory에서 제공하는 기본적인 빈 관리, 조회 기능을 모두 상속 받는다.

 

ApplicationContext는 기본적인 기능을 제공하는 BeanFactory 외에도, 애플리케이션 개발 시 필요한 부가기능을 여러 인터페이스를 통해 상속 받는다. 

 

 

MessageSource : 메시지소스를 활용한 국제화 기능 포함
EnvironmentCapable : 로컬, 개발, 운영 등의 환경을 구분해서 처리할 수 있게 환경변수를 지원한다.
ApplicationEventPublisher : 애플리케이션에서 이벤트를 발행하고 구독하는 모델을 편리하게 지원한다.
ResourceLoader : 파일, 클래스패스, 외부 등에서 리소스를 편리하게 조회하는 기능을 지원한다.

 

 

 

이렇게 애플리케이션 개발 시 필요한 많은 부가기능을 제공하기 때문에 ApplicationContext를 스프링 컨테이너로 주로 사용한다.

 

Spring Container 특징 

1. 싱글톤 컨테이너

대부분의 스프링 애플리케이션은 주로 웹 애플리케이션으로 사용된다. 

 

웹 애플리케이션은 보통 여러 고객이 동시에 요청하는데, 요청을 할 때마다 객체를 생성하게 되면 너무 많은 객체가 생성되어 자원을 낭비하게 된다. 

 

그래서 스프링 컨테이너는 컨테이너 생성 할 때, 컨테이너에 클래스 인스턴스를 1개만 생성해두고 클라이언트 요청이 들어올 때 마다 공유해서 사용하는 싱글톤 패턴을 사용한다.

 

2. 다양한 설정 정보 형식 지원 (BeanDefinition)

스프링 컨테이너는 설정 정보로 어노테이션 기반 자바 코드, XML 설정, Groovy 등 다양한 설정 형식을 통해 빈을 등록할 수 있게 지원한다.

 

이렇게 다양한 설정 형식을 지원할 수 있는 이유는 스프링 컨테이너가 BeanDefinition라는 인터페이스를 통해서 스프링 빈 설정 메타정보 받아 빈을 설정하기 때문이다. (@Bean, <bean> 가 각각 하나식 메타정보이다.)

 

그렇기 때문에 스프링 컨테이너는 전달받은 메타 정보가 어떤 형식인지 알지 않아도 된다 (역할과 책임을 분리)

 

이 때 ApplicationContext 구현 클래스 마다 각자 형식에 맞는 BeanDefinition의 구현체를 가져와서 빈 메타 정보를 생성한 뒤 컨테이너에 전달한다.

 

 

예시) 컨테이너 생성 시 빈 설정 형식이 XML일 때

 

참고로 BeanDefinition의 메타 정보로 아래의 내용이 있다

(* 팩토리 역할의 빈 : 자바 어노테이션 방식의 설정파일을 팩토리 역할이라고 한다 *)

 

BeanClassName : 생성할 빈의 클래스 명 (만약 팩토리 역할의 빈을 사용하는 경우 빈값)
FactoryBeanName : 자바 설정 파일 이름 (팩토리 역할을 사용하는 경우)
FactoryMethodName : 빈을 생성할 팩토리 메소드 이름, 빈 이름과 동일 (팩토리 역할을 사용하는 경우)
Scope : 싱글톤 (기본값이다)
lazyInit : 스프링 컨테이너 생성 시에 빈을 생성하지 않고, 실제 빈을 사용할 때 생성할 지 여부
InitMethodName: 빈을 생성하거나 의존관계를 적용한 뒤 호출되는 초기화 메소드명
DestoryMethodName : 빈의 생명주기가 끝난 뒤 제거하기 직전 호출되는 메소드명
Constructor arguments, Properties : XML에서 의존관계 주입시 사용됨 (팩토리 역할에서는 사용하지 않는다)

 

Spring Container 생성 과정

1. 스프링 컨테이너 생성

스프링 컨테이너는 스프링 빈 설정 정보 (config 파일)를 전달받아서 컨테이너를 생성한다. 

 

2. 스프링 빈(Bean) 등록

스프링 컨테이너는 전달 받은 설정 정보를 활용하여 컨테이너 내부 빈 저장소에 스프링 빈을 등록한다. 

 

3. 스프링 빈 의존관계 설정

스프링 컨테이너 생성 시 설정 정보를 참고하여 의존관계를 주입한다.

 

 

출처 : 김영한님, 스프링 핵심 원리 기본편