2 minute read

스프링 컨테이너

스프링 컨테이너란?

스프링 컨테이너는 스프링 빈의 생명 주기를 관리하여 IoC(제어역전)와 DI(의존성주입)을 제공해주는 역할을 한다.

스프링 컨테이너는 Bean Factory와 이를 상속한 ApplicationContext 2가지 유형이 존재한다.


Bean Factory

Bean Factory는 스프링 컨테이너의 최상위 인터페이스로 스프링 컨테이너 설정파일에 등록된 Bean 객체를 생성하고 관리하는 기본적인 기능만 담당하는 IoC 컨테이너이자 클래스를 말한다. 컨테이너가 구동될 때 Bean 객체를 생성하는 것이 아니라 빈 사용 요청에 의해서 Bean 객체가 사용되는 시점(Lazy Loading) 에 객체를 생성하는 방식이다.


ApplicationContext

ApplicationContext는 BeanFactory 인터페이스의 하위 인터페이스로 빈 관리 기능(DI 와 IoC) 뿐만 아니라 편리한 부가 기능을 제공한다. 트랜잭션 관리, 메시지 기반의 다국어 처리, AOP 처리 등 많은 부분을 지원한다. 컨테이너가 구동되는 시점에 Bean 객체들을 생성하는 방식이다.


스프링 컨테이너 생성과정

  • 스프링 컨테이너가 생성된다.
  • 스프링 빈을 등록한다.
    • 수동 빈 등록을 한다면 설정 정보를 읽어서 스프링 빈을 등록한다.
    • 자동 빈 등록을 한다면 @Component가 붙은 클래스들을 스프링 빈으로 등록한다.
  • 스프링 빈의 의존관계를 설정한다.
    • 수동 빈 등록을 할시에는 설정 정보를 읽어서 의존관계를 주입한다.
    • 자동 빈 등록을 할시에는 등록된 빈에 생성자나 @Autowired를 보고 의존관계를 주입한다.


스프링이 설정 파일을 읽는 과정

XML 설정 파일이나 자바 설정 파일에 빈을 정의해주면 해당 설정 파일을 이용해 스프링 컨테이너가 빈 정의 내용대로 빈을 관리하도록 한다.

스프링은 어떻게 이런 다양한 설정 형식을 지원하는 것일까?

그 중심에는 BeanDefinition이라는 추상화가 있다. XML이든 자바 코드든 읽어서 BeanDefinition을 만들면 된다. 스프링 컨테이너는 자바 코드인지, XML인지 몰라도 되고 오직 BeanDefinition만 알면 된다.

BeanDefinition은 빈 설정 메타정보라고 한다. 스프링 컨테이너는 이 메타정보를 기반으로 스프링 빈을 생성한다.

image


싱글턴 패턴

스프링은 태생이 기업용 온라인 서비스 기술을 지원하기 위해 탄생했다. 웹 어플리케이션은 보통 여러 고객이 동시에 요청을 하는데 만약 대량의 트래픽이 들어왔을 때 요청마다 객체가 생성되고 소멸된다면 메모리 낭비가 심할 것이다. 스프링의 해결 방안으로는 싱글톤 패턴을 사용하여 해당 객체를 1개만 생성하게 하고 공유하도록 하는 것이다.

하지만 싱글톤 패턴에는 여러가지 문제점이 있다.

  • private 생성자를 갖고 있기 때문에 상속할 수 없다.
  • 싱글톤은 테스트하기가 힘들다.
  • 필드에 공유 값을 설정하면 큰 장애가 발생할 수 있다.

스프링은 이런 싱글톤 패턴의 문제점을 해결했다.

스프링은 기본적으로 별다른 설정을 하지 않으면 내부에서 생성하는 빈 오브젝트를 모두 싱글톤으로 만듭니다.

여기서 싱글톤은 디자인 패턴에서 나오는 싱글톤 패턴과 비슷한 개념이지만 구현 방법은 다릅니다.


싱글턴 레지스트리

스프링은 기본적으로 별다른 설정을 하지 않으면 내부에서 생성하는 빈 오브젝트를 모두 싱글톤으로 만든다. 여기서 싱글톤은 디자인 패턴에서 나오는 싱글톤 패턴과 비슷한 개념이지만 구현 방법은 다르다. 또한 위의 싱글톤 패턴의 단점들을 보완한 상태를 사용한다. 이렇게 애플리케이션 컨텍스트는 싱글톤을 저장하고 관리하는 싱글톤 레지스트리라고 할 수 있다.

private 생성자로 객체의 생성을 막는 방법이 아니라 일반 자바 클래스를 싱글톤으로 활용할 수 있도록 지원한다.

가장 중요한 것은 싱글톤 패턴과 달리 스프링이 지지하는 객체지향적인 설계 방식의 원칙, 디자인 패턴 등을 적용하는데 아무런 제약이 없게 만들어준다는 것입니다.



참고
스프링 핵심 원리 - 기본편 (김영한 님) 토비의 스프링 - vol.1 (이일민 님)

Updated: