ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스프링 빈 설정 메타 정보 - BeanDefinition
    FrameWork/Spring&Spring-boot 2022. 1. 10. 13:05

     

    • 스프링은 어떻게 이런 다양한 설정 형식을 지원하는 것일까? 그 중심에는 'BeanDefinition'이라는 추상화가 았다.
    • 쉽게 이야기 해서 *역할구현을 개념적으로 나눈 것*이다.

         - XML을 읽어서 BeanDefinition을 만들면 된다.

         - 자바 코드를 읽어서 BeanDefinition을 만들면 된다.

         - 스프링 컨테이너는 자바코드인지,XML인지 몰라도 된다. 오직BeanDefinition만 알면 된다.

    • 'BeanDefinition'을 빈 설정 메타 정보라 한다.

         - '@Bean', '<bean>'당 가가 하나씩 메타 정보가 생성된다.

    • 스프링 컨테이너는 이 메타정보를 기반으로 스프링 빈을 생성한다.

    *코드 레벨로 조금 더 깊이 있게 들어가보자*

     

    • 'AnnotationConfigApplicationContext''AnnotatedBeanDefinitionReader'를 사용해서                                     'AppConfig.class'를 일고 'BeanDefinition'을 생성한다.

         +Java 코드들을 설정 정보처럼 읽어 들인다. Bean의 meta정보를 읽어서 담아 놓는다.

    • 'GenericXmlApplicationContext''XmlBeanDefinitionReader'를 사용해서 'appConfig.xml'설정 정보를 읽고            'BeanDefinition'을 생성한다.
    • 새로운 형식의 설정 정보가 추가되면,XxxBeanDefinitionReader를 만들어서'BeanDefinition'을 생성하면 된다.

     

    BeanDefinition살펴보기

    public class BeanDefinitionTest {
    
        AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
    
        @Test
        @DisplayName("빈 설정 메타정보 확인")
        void findApplicationBean(){
            String[] beanDefinitionNames = ac.getBeanDefinitionNames();
            for(String beanDefinitionName : beanDefinitionNames){
                BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);
    
                if(beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION){
                    System.out.println("beanDefinitionName = " + beanDefinitionName +
                    "beanDefinition = "+beanDefinition );
                }
            }
    
        }
    

     

    ApplicationContext는 .getBeanDefinition 메서드가 없다.

    +스프링 어플리케이션을 사용하는 입장에서는 getBeanDefinition 같은 복잡한 메서드를 사용할 일이 없기 때문에, 정의가 되어 있지 않다.

     

     

     

    BeanDefinition정보

    • BeanClassName : 생성할 빈의 클래스 명(자바 설정 처럼 팩토리 역할의 빈을 사용하면 없음)
    • factoryBeanName : 팩토리 역할의 빈을 사용할 경우 이름 예)appConfig
    • factoryMethodName : 빈을 생성할 팩토리 메서드 지정 예)memberService
    • Scope : 싱글톤(기본값)

        +할당이 되어있지 않으면 싱들톤 이라는 의미

    • lazyInit : 스프링 컨테이너를 생성할때 빈을 생성하는 것이 아니라, 실제 빈을 사용할 때까지 최대한 생성을 지연처리 하는지 여부

        +보통 스프링 빈들이 스프링 컨테이너가 뜰 때 등록이 된다.

    • InitMethodName : 빈을 생성하고, 의존관계를 적용한 뒤에 호출되는 초기화 메서드 명
    • DestroyMethodName : 빈의 생명주기가 끝나서 제거하기 직전에 호출되는 메서드 명
    • Constructor arguments,Properties : 의존관계 주입에서 사용한다.(자바 설정 처럼 팩토리 역할의  빈을 사용하면 없음)

        +BeanLifecycle

     

    public class BeanDefinitionTest {
    
        GenericXmlApplicationContext ac=  new GenericXmlApplicationContext("appConfig.xml");
    
        @Test
        @DisplayName("빈 설정 메타정보 확인")
        void findApplicationBean(){
            String[] beanDefinitionNames = ac.getBeanDefinitionNames();
            for(String beanDefinitionName : beanDefinitionNames){
                BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);
    
                if(beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION){
                    System.out.println("beanDefinitionName = " + beanDefinitionName +
                    "beanDefinition = "+beanDefinition );
                }
            }
    
        }
    
    
    }
    

    예전에는 appconfig를 다 xml로 설정하면서 bean에 대한 class가 다 밖으로 들어났다. 그런데 cofig 방식이 

    Java config로 바뀌었다.

     

    spring에서 Bean을 등록하는 방식은 크게 2가지 =>

     

    1 . 직접 스프링 빈을 등록하는 방법

        

        +class가 직접적으로 들어난다.

     

    2 . 약간 우회하는 방법으로 factory메서드를 사용하는 방법

     

       +Java코드를 사용해서 쓰는 방법은 factory메서드를 사용해서 등록하는 방법이라고 한다.

        외부에서 호출해서 제공하는 방식

     

      +class가 null

     

      +factoryBeanName이라는 에서 factoryMethodName을 통해서 Bean이 생성된다.

     

     

    정리

    • BeanDefinition을 직접 생성해서 스프링 컨테이너에 등록할 수 도 있다. 하지만 실무에서 BeanDefinition을 직접 정의하거나 사용할 일은 거의 없다.
    • BeanDefinition에 대해서는 너무 깊이있게 이해하기 보다는 스프링이 다양한 형태의 설정 정보를 BeanDefinition으로 추상화해서 사용하는 것 정도만 이해하면 된다.
    • 가끔 스프링 코드나 스프링 관련 오픈 소스의 코드를 볼 때, BeanDefinition이라는 것이 보일 때가 있다. 이때 이러한 매커니즘을 떠올리면된다. 

     

     

    [출처 : 김영한. 스프링 핵심 원리-기본편. 인프런]

     

    'FrameWork > Spring&Spring-boot' 카테고리의 다른 글

    싱글톤 패턴  (0) 2022.01.10
    싱클톤 컨테이너  (0) 2022.01.10
    다양한 설정 형식 지원 - 자바 코드, XML  (0) 2022.01.09
    BeanFactory와 ApplicationContext  (0) 2022.01.09
    스프링 빈 조회-상속관계  (0) 2022.01.02

    댓글

Designed by Tistory.