스프링 핵심 원리 정리 - 3

BeanFactory와 ApplicationContext

BeanFactory

  • 스프링 컨테이너의 최상위 인터페이스
  • 스프링 빈을 관리하고 조회하는 역할
  • getBean() 제공

ApplicationContext

  • BeanFactory 기능을 모두 상속받아서 제공
  • BeanFactory가 제공하는 빈을 관리하고 검색하는 기능 외에도 애플리케이션을 개발할 때 필요하는 많은 부가 기능 제공
ApplicationContext가 제공하는 부가 기능
  • 메세지 소스를 활용한 국제화 기능(MessageSource interface)
    • 한국에서 들어오면 한국어로, 영어권에서 들어오면 영어로 출력
  • 환경 변수(EnvironmentCapable interface)
    • 로컬, 개발, 운영 등을 구분해서 처리
  • 애플리케이션 이벤트(ApplicationEventPublisher interface)
    • 이벤트를 발행하고 구독하는 모델을 편리하게 지원
  • 편리한 리소스 조회(ResourceLoader interface)
    • 파일, 클래스 패스, 외부 등에서 리소스를 편리하게 조회

XML 설정

스프링 컨테이너는 Java, XML, Groovy 등 다양한 형식으로 설정할 수 있도록 되어 있다.

애노테이션 기반 자바 코드 설정

  • new AnnotationConfigApplicationContext(AppConfig.class)
  • AnnotationConfigApplicationContext 클래스를 사용하여 자바 코드로된 설정 정보를 넘기게 된다.

XML 설정 사용

  • 최근에는 스프링 부트를 사용하면서 XML 기반의 설정은 잘 사용하지 않지만, xml을 사용하면 컴파일 없이 빈 설정 정보를 변경할 수 있다는 장점이 있다.
  • GenericXmlApplicationContext 를 사용하여 xml 설정 파일을 넘긴다.

스프링 빈 메타 정보 - BeanDefinition

  • 스프링이 다양한 설정 형식을 지원하는 것은 BeanDefinition이라는 인터페이스가 있기 때문이다.
  • BeanDefinition은 역할과 구현을 개념적으로 나눈다. 자바 코드이든, xml이든 설정 정보를 읽어서 BeanDefinition을 만들고 스프링 컨테이너는 형식을 알 필요 없이 BeanDefinition만 알면 된다.
  • BeanDefinition을 빈 설정 메타 정보라 하며 @Bean 또는 <bean> 마다 하나씩 메타 정보가 생성된다.
  • 스프링 컨테이너는 이 메타 정보를 기반으로 스프링 빈을 생성한다.

  • AnnocationConfigApplicationContextAnnotatedBeanDefinitionReader 를 사용해서 AppConfig.class를 읽고 BeanDefinition 을 생성한다.
  • GenericXmlApplicationContextXmlBeanDefinitionReader 를 사용해서 appConfig.xml 설정 정보를 읽고 BeanDefinition 을 생성한다.