ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스프링 빈 설정 메타 정보 - BeanDefinition
    spring/스프링 핵심 원리 강의 내용 정리 2023. 12. 8. 14:36

    스프링은 어떻게 이런 다양한 설정을 지원하는 것일까?
    그 중심에는 BeanDefinition 이라는 추상화가 있다
    쉽게 이야기해서 역할과 구현을 개념적으로 나눈 것 이다
    - XML을 읽어서 BeanDefinition을 만들면 된다
    - 자바 코드를 읽어서 BeanDefinition을 만들면 된다
    - 스프링 컨테이너는 자바 코드인지, XML인지 몰라도 된다. 오직 BeanDefinition만 알면 된다

    이때의 BeanDefinition을 빈 설정 메타 정보 라고 한다
    - @Bean, <bean> 당 각각 하나의 메타 정보가 생성된다
    스프링 컨테이너는 이 메타정보를 기반으로 스프링 빈을 생성한다


    코드 레벨로 조금 더 깊게 들어가 보자
    - AnnotationConfigApplicationContext 는 AnnotatedBeanDefinitionReader 를 사용해서
     AppConfig.class 를 읽고 BeanDefinition 을 생성한다.
    - GenericXmlApplicationContext 는 XmlBeanDefinitionReader 를 사용해서 appConfig.xml
     설정 정보를 읽고 BeanDefinition 을 생성한다.
    - 새로운 형식의 설정 정보가 추가되면, XxxBeanDefinitionReader를 만들어서 BeanDefinition 을 생성하
     면 된다

     

    BeanDefinition 정보를 확인 하는 방법을 알아보자


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

     

    이 메타 정보를 기반으로 실제 인스턴스를 생성할 수 있다

     

    참고로 Xml 로 메타 정보를 조회했을 때는 조금 다르다

    Generic bean: class [hello.core.member.MemberServiceimpl]

    과 같은 빈에 대한 정보가 명확하게 적혀있다

    또한 factoryBeanName=null; factoryMethodName=null;

    처럼 이전엔 적혀있던 정보가 null이 되어 있다

    무슨 차이가 있는 걸까

     

    Xml의 설정 정보와 같이 빈을 등록하는 것은, 직접 빈을 등록하는 것이다

    때문에 자체적으로 class를 가지고 있는 것이고, factoryBean 이름, 메서드 명은 없는 것이다

     

    AppConfig 같이 자바 코드로 빈을 등록하는 것은, factoryMethod 를 통해서 등록하는 방법이라고 부른다

    반대로 자체적으로 class는 null이며, factoryBean 이름, 메서드 명을 가지고 있다

     

    모른다고 해도 크게 영향이 없는 지식이라고는 하는데, 왜 이런 지식만 유난히 머리에 잘들어오는지 모르겠다

    BeanDefinition 이라는 단어가 머리에 콕 박혀서 평생 안지워질 것 같은 선명함이 느껴진다

    아무튼... 가볍게 가볍게 머리의 리소스를 아껴가며 넘어간다

Designed by Tistory.