본문 바로가기
Spring

스프링 컨테이너와 스프링 빈(ApplicationContext, BeanFactory, BeanDefinition)

by S2채닝S2 2024. 11. 27.

스프링 컨테이너 생성

  • ApplicationContext 를 스프링 컨테이너라고 하며, ApplicationContext는 인터페이스이다.
  • 스프링 컨테이너는 XML을 기반으로 만들 수 있고, 애노테이션 기반의 자바 설정 클래스로 만들 수 있다.
    • 자바 설정 클래스: AnnotationConfigApplicationContext를 ApplicationContext의 구현체로 사용
    • XML: GenericXmlApplicationContext를 ApplicationContext의 구현체로 사용

스프링 컨테이너 생성 과정

스프링 컨테이너 생성과정

  • 스프링 컨테이너 생성: 스프링 컨테이너(ApplicationContext)를 생성할 때에는 구성 정보를 지정해주어야 한다. 위 그림에서는 자바 클래스를 구성 정보로 지정했다. (new AnnotationConfigApplicationContext(AppConfig.class)
  • 스프링 컨테이너는 파라미터로 넘어온 설정 클래스 정보를 사용해서 스프링 빈을 등록한다. (AppConfig.class를 읽어 스프링 빈을 등록)
    • 빈 이름은 기본적으로 메서드 이름을 사용하며 직접 부여할수도 있다.
    • 빈 이름은 항상 다른 이름을 부여해야 한다. 같은 이름을 부여하면 다른 빈이 무시되거나 기존 빈을 덮어버리는 등 설정에 따라 오류가 발생한다.
  • 스프링 컨테이너는 설정 정보를 참고해서 의존관계를 주입(DI)한다.

BeanFactory와 ApplicationContext

BeanFactory와 ApplicationContext

BeanFactory

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

ApplicationContext

  • BeanFactory 기능을 모두 상속받아 제공하고 기타 부가기능을 제공한다
  • BeanFactory를 직접 사용할 일은 거의 없으며, 부가기능이 포함된 ApplicationContext를 사용한다.
  • BeanFactory나 ApplicationContext를 스프링 컨테이너라고 한다.
  • 부가기능
    • 메시지 소스를 활용한 국제화 기능(한국 접속 시 한국어, 영어권 접속시 영어로 출력)
    • 환경변수: 로컬, 개발, 운영 등을 구분해서 처리
    • 애플리케이션 이벤트: 이벤트 발행 및 구독 모델 편리하게 지원
    • 편리한 리소스 조회: 파일, 클래스패스, 외부 등에서 리소스를 편리하게 조회
  • 스프링 컨테이너는 자바코드, XML 등 다양한 형식의 설정 정보를 받아들일 수 있게 유연히 설계되어 있다.

BeanDefinition

ApplicationContext와 BeanDefinition

  • 스프링은 BeanDefinition이라는 추상화를 통하여 다양한 설정 형식을 지원한다.
  • BeanDefinition을 빈 설정 메타정보라고 하며, @Bean, 당 각각 하나씩 메타정보가 생성된다
  • 스프링 컨테이너는 이 메타정보를 기반으로 스프링 빈을 생성한다.
  • 역할과 구현의 분리: 스프링 컨테이너는 설정 정보가 자바 코드인지, XML인지 몰라도 된다. BeanDefinition만 알면 된다. BeanDefinition을 통해 읽은 메타정보를 기반으로 스프링 빈을 생성하기 때문이다.
  • BeanDefinition 정보
    • BeanClassName: 생성할 빈의 클래스 명(Factory 역할의 빈 사용 시 null)
    • factoryBeanName: 팩토리 역할의 빈 이름 (예: AppConfig)
    • factoryMethodName: 빈을 생성할 팩토리 메서드 지정 (예: memberService)
    • Scope: 빈 스코프. 미 지정시 싱글톤이 기본값
    • lazyInit: 스프링 컨테이너 생성 시 빈을 생성하는 것이 아닌 실제 빈을 사용할 때까지 생성을 지연할 것인지 여부
    • InitMethodName: 빈을 생성하고 의존관계를 적용한 뒤 호출되는 초기화 메서드 명
    • DestroyMethodName: 빈 생명주기가 종료되어 제거하기 직전 호출되는 메서드 명
    • Constructor arguments, Properties: 의존관계 주입 시 사용(XML의 , 등 / Factroy 역할의 빈 사용 시 null)

정리

  • BeanFactory 혹은 ApplicatonContext를 스프링 컨테이너라고 하며, ApplicationContext는 BeanFactory를 상속받는다.
  • '스프링 컨테이너'라고 하면 주로 ApplicationContext를 지칭하며, ApplicationContext는 BeanFactory의 기능+부가기능을 제공한다
  • ApplicationContext는 BeanDefiniton을 읽어 스프링 빈을 생성한다.
  • BeanDefinition은 스프링 빈을 설정하는 메타정보이다.
  • 스프링 컨테이너는 BeanDefinition의 메타정보로 스프링 빈을 생성하므로 다양한 설정 형식을 지원할 수 있다.

최근댓글

최근글

skin by © 2024 ttuttak