본문 바로가기
[Spring]/Spring 기본

스프링 컨테이너(IoC / DI 컨테이너), BeanDefinition

by 황원용 2023. 2. 28.
728x90

컨테이너(Container)

  • 인스턴스의 생명주기(라이프 사이클)을 관리한다.
  • 생성된 인스턴스에 추가적인 기능을 제공한다.
  • 톰캣(WAS)은 Servlet 컨테이너를 통해 Servlet 요청을 해결한다.

 

 

스프링의 IoC / DI 컨테이너

  • 스프링에서 객체를 생성하고 관리하며 객체 간 의존 관계를 연결해 준다.
  • 의존 관계 주입에 포커스를 맞추어 최근에는 DI 컨테이너라고 부르는 경우도 많다.
  • 혹은 어샘블러, 오브젝트 팩토리 등으로도 불린다.

 

 

BeanFactory 

  • 스프링 컨테이너의 최상위 인터페이스이다.
  • 스프링 빈을 관리하고 조회하는 역할을 담당한다.
  • IoC/DI에 대한 기본 기능을 가지고 있다.

 

 

ApplicationContext

  • BeanFactory 기능을 모두 상속받아 제공한다.
  • 보통 스프링 컨테이너라고하면 ApplicationContext를 뜻한다.
  • 스프링 컨테이너에서 객체를 스프링 빈으로 등록하고, 빈을 찾아 사용할 수 있다.
    • 빈 이름은 중복이 되어서는 안 된다.
  • ApplicationContext 또한 인터페이스이다.
  • 빈을 관리하고 조회하는 기능 + 수많은 부가 기능을 제공한다.
    • 메시지 소스를 활용한 국제화 기능
      • 한국에서 접속하면 한국어로, 영어권에서 접속하면 영어로 출력
    • 환경변수
      • 로컬, 개발, 운영 등을 구분해서 처리
    • 애플리케이션 이벤트
      • 이벤트를 발행하고 구독하는 모델을 편리하게 지원
    • 편리한 리소스 조회
      • 파일, 외부 등에서 리소스를 편리하게 조회

 

 

정리

  • BeanFactory나 ApplicationContext를 스프링 컨테이너라고 한다.
  • ApplicationContext는 BeanFactory와 기타 여러 인터페이스의 기능을 상속받는다.
  • BeanFactory를 직접 사용하는 일은 거의 없고, 부가 기능이 포함된 ApplicationContext를 사용한다.

 

빈 조회

 AnnotationConfigApplicationContext ac = new
  AnnotationConfigApplicationContext(AppConfig.class);
  
  스프링 빈 조회
  ac.getBeanDefinitionNames() // 스프링에 등록된 모든 빈 이름을 조회
  ac.getBean(빈이름, 타입) // 빈 이름으로 빈 객체를 조회
  ac.getBean(타입) // 타입으로 빈 객체를 조회
  ac.getBeansOfType() // 해당 타입의 모든 빈을 조회
  상속 관계 : 부모 타입으로 조회하면, 자식 타입도 함께 조회된다.
  조회하려는 스프링 빈이 없으면 NoSuchBeanDefinitionException 예외 발생
  
  BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);
  
  BeanDefinition.ROLE_APPLICATION // 직접 등록한 애플리케이션 빈
  BeanDefinition.ROLE_INFRASTRUCTURE: // 스프링이 내부에서 사용하는 빈

 

 

 

스프링 빈 설정 메타 정보 - BeanDefinition

  • 스프링 컨테이너는 자바코드, XML 등 다양한 설정 정보를 읽어낼 수 있도록 유연하게 설계되어 있다.
  • 이렇게 다양한 설정 형식을 지원할 수 있는 이유는 BeanDefinition이라는 추상화 덕분이다.
  • 스프링 컨테이너는 자바 코드인지, XML인지 모른다. 오직 BeanDefinition만 알면 된다.
    • 역할과 구현을 개념적으로 나눈 것이다.
    • 자바 코드, XML을 읽어 빈 설정 메타 정보인 BeanDefinition을 생성하고, 이를 기반으로 스프링 빈을 생성한다.
    • @Bean : 애너테이션, <bean> : XML 등을 읽고 각각의 메타 정보를 생성한다.
  • 가끔 스프링 코드나 스프링 관련 오픈 소스 코드에 BeanDefinition이 보이는데 이때 이 메커니즘을 떠올리자.

 

 

참고

김영한 - 스프링 핵심 원리

https://velog.io/@re-deok/스프링-IoC-DI-컨테이너

728x90