1 분 소요

스프링 컨테이너

스프링 컨테이너란?

스프링 컨테이너는 IoC 컨테이너이다. IoC 컨테이너에 대해 잘 모른다면 이전 포스트를 참고하자. 스프링 컨테이너를 지칭할 때, ApplicationContext, BeanFactory로 나누는데 일반적으로 BeanFactory를 직접 사용할 일이 없기 때문에 ApplicationContext를 스프링 컨테이너라고 생각하면 된다.

생성 과정

스프링 컨테이너 생성

스프링 빈들을 저장할 컨테이너를 먼저 생성한다. 빈은 이름과 실제 객체를 쌍으로 저장된다.

img1

빈 등록

  • @Configuration이 붙은 클래스 내부의 @Bean이 붙은 메소드 (수동 등록)
  • 컴포넌트 스캔 방식, @Component가 붙은 클래스 (자동 등록)

전자는 메소드 이름을 가지고 빈 이름이 등록된다. 그리고 메소드가 반환하는 객체가 빈 객체로 들어가게 된다.

img1

후자는 클래스 이름의 첫글자를 소문자로 바꾼것이 빈 이름으로 등록된다. 객체로는 클래스 인스턴스를 하나 생성해서 들어가게 된다.

img1

  • 참고: @Service내부에는 @Component가 있기 때문에 스프링 빈으로 등록된다.
  • 이 방식은 컴포넌트 스캔을 통해서 등록되는 것인데 자세한 것은 다음에 설명하겠다.

빈 사이의 의존관계 설정

위에 코드를 보면 userRepository와 userService가 빈으로 등록된 것을 알 수 있다. 그런데 userService는 userRepository를 의존하고 있고 스프링 컨테이너는 userService에 이 의존성을 주입해줘야 한다. 이러한 의존성 주입은 빈 등록이 다 완료되고 일어난다.

BeanFactory

이제 앞에 잠깐 말했었던 BeanFactory에 대해서 알아보자. BeanFactory는 스프링 컨테이너의 최상위 인터페이스이다.

스프링 빈을 조회하는 기능(getBean())을 가지고 있다. ApplicationContext는 BeanFactory를 구현하여 조회 기능을 제공하고 추가로 편리한 부가기능을 더 가지고 있다.

img1

MessageSource

국제화 기능을 제공한다. 사용자의 Locale에 따라 출력되는 언어를 변경한다.

  • Locale: 세계 각 국에서 사용하는 언어, 문자, 화폐 표시, 시간등에 대해 국제화 와 지역화를 통해 어떻게 표시할 지 정의한 매개 변수의 모음

EnvironmentCapable

로컬, 개발, 운영에 따라 사용할 빈들을 그룹화한다.

ApplicationEventPublisher

옵저버 패턴의 구현체로 Publisher와 Observer 사이의 결합도를 낮추면서 Observer에게 Event를 전달하고 싶을 때 사용한다.

ResourceLoader

파일, 클래스패스, 외부 리소스를 편리하게 조회할 수 있는 기능을 제공한다.

BeanDefinition

스프링 컨테이너는 다양한 형식의 설정 정보를 토대로 구성할 수 있다. (자바 코드, XML 등등)

이는 BeanDefinition을 통해서 실현된다.

img1

스프링 컨테이너의 구현체인 AnnotationConfigApplicationContext, GenericXmlApplicationContext..는 각자 BeanDefinitionReader의 구현체를 사용하여 설정 정보를 읽고 BeanDefinition을 생성하게 된다. 그리고 스프링 컨테이너는 BeanDefinition을 기반으로 스프링 빈을 생성하게 된다.

스프링 컨테이너 입장에서는 BeanDefinition만 알면 되기 때문에 설정 정보가 .class인지, .xml인지 몰라도 된다.

참고

태그:

카테고리:

업데이트: