본문 바로가기

Development/Spring Boot

[Spring Boot] 스프링 빈 설정 메타 정보 - BeanDefinition (중요)

1- 스프링은 어떻게 다양한 설정 형식을 지원하나?

  • BeanDefinition 이라는 추상화가 존재하기 때문
  • 쉽게 이야기해 역할구현을 개념적으로 나눈 것

  • [ XML 혹은 자바 코드 ]를 읽어 BeanDefinition을 만들면 됨
  • 스프링 컨테이너는 설정 파일 형식이 자바 코드인지, XML인지 몰라도 됨. 오직 BeanDefinition만 알면 됨.

  • BeanDefinition을 빈 설정 메타정보라 함
    @Bean, <bean>당 각각 하나씩 메타 정보가 생성됨

  • 스프링 컨테이너는 이 메타정보를 기반으로 스프링 빈을 생성함
    스프링 컨테이너 내부는 추상화에만 의존하도록 설계되어 가능한 것.

2- 코드 레벨로 들어가 살피기

  • AnnotationConfigApplicationContext는 AnnotatedBeanDefinitionReader를 사용해 AppConfig.class를 읽고,
    BeanDefinition을 생성함

  • GenericXmlApplicationContext는 XmlBeanDefinitionReader를 사용해 appConfig.xml을 읽고,
    BeanDefinition을 생성함

  • 새로운 형식 설정 정보가 추가된다면 OOOBeanDefinitionReader를 만들어 BeanDefinition을 생성하면 됨.

    왜? 스프링 컨테이너는 BeanDefinition으로 스프링 빈을 생성하게 설계되어 있기에. 반드시 BeanDefinition을 생성해줘야 함

3- BeanDefinition 살펴보기

  • BeanDefinition 정보
    - BeanClassName : 생성할 빈의 클래스 명( 자바 설정 처럼 팩토리 역할의 빈을 사용하면 없음 )
    - factoryBeanName : 팩토리 역할의 빈을 사용할 경우 이름. (ex. appConfig )
    - factoryMethodName : 빈을 생성할 팩토리 메서드 지정. (ex. memberService )
    - Scope: 싱글톤 (기본 값)
    - lazyInit: 스프링 컨테이너 생성시 빈을 생성하는 것이 아닌, 실제 빈을 사용할 때까지 최대한 생성 지연 처리
    - InitMethodName: 빈을 생성하고 의존관계를 적용한 뒤 호출되는 초기화 메서드 명
    - DestroyMethodName: 빈의 생명주기가 끝나 제거하기 직전에 호출되는 메서드명
    - Constructor arguments, Properties: 의존관계 주입에서 사용 ( 자바 설정 처럼 팩토리 역할의 빈을 사용하면 없음 )

  • BeanDefinition 출력 예시

 

4- 정리

  • BeanDefinition을 직접 생성해 스프링 컨테이너에 등록할 수 있음. 허나 실무에서 BeanDefinition을 직접 정의하거나 사용할 일은 거의 없음.

  • BeanDefinition에 대해 깊게 이해하기 보다는, 스프링이 다양한 형태의 설정 정보를 BeanDefinition으로 추상화해 사용하는 것
    정도만 이해
    하면 됨

  • 가끔 스프링 코드나 스프링 관련 오픈 소스를 볼 때, BeanDefinition이 보일때가 있는데 이런 메커니즘을 떠올리면 됨

  • GenericXmlApplicationContext => 클래스 루트까지 정보가 상세하게 나옴

  • AppConfig.java => 팩토리 메서드를 통해 설정 정보를 제공하는 방식