이번 시간에는 스프링의 빈 설정 메타 정보인 BeanDefinition에 대해서 알아보았다.
스프링이 xml, 자바 Config와 같이 다양한 설정 형식을 지원할 수 있는데,
그 이유는 BeanDefinition 이라는 추상화가 있기 때문이다. 즉, 빈 정보에 대한 것을 추상화 시켰기 때문에 가능하다.
쉽게 말해서, 역할과 구현을 개념적으로 나눈 것이라고 보면 된다.
자세히 살펴보면, 구현체인 XML을 읽고 BeanDefinition을 만들고,
자바 코드를 읽어서 BeanDefinition을 만든다.
스프링 컨테이너 입장에서 보면 자바 코드인지, xml인지 몰라도 되고, 추상화 객체인 BeanDefinition만 알면 된다.
그것을 기반으로 빈 생성을 하면 된다.
BeanDefinition은 빈 설정 메타정보라고 한다.
자바 코드에서 @Bean, xml에서는 <bean>을, 하나당 하나씩 메타 정보가 생성이 된다.
결국 스프링 컨테이너는 BeanDefinition에만 의존하는 것이다.
BeanDefinition을 들어가보면 인터페이스로 되어있는 것을 확인할 수 있다.
자바코드로 설정 정보를 불러오는 AnnotationConfigApplicationContext에 들어가보면 위의 사진과 같이 되어있다.
그중에서 AnnotatedBeanDefinitionReader를 살펴보면,
AnnotationConfigApplicationContext는 AnnotatedBeanDefinitionReader를 사용해서 AppConfig.class 설정 정보를 읽고,
빈 메타정보를 생성하면서 BeanDefinition을 만들어낸다.
BeanDefinition을 테스트하기 위해 패키지를 생성하고 클래스를 생성해준다.
getBeanDefinitionNames, 즉 BeanDefinition의 이름들을 꺼내주고, foreach문 안에서 getBeanDefinition으로
Bean정보를 얻어온다.
그리고 role이 application role인 것만 출력하게 해준다. (아니면 너무 많이 출력이 되기 때문)
테스트 결과, BeanDefinition이 콘솔에 찍힌것을 확인할 수 있다.
위와 같은 메타정보를 기반으로 인스턴스를 생성할 수 있다.
테스트 한 것과 같이, 실무에서는 BeanDefinition을 직접 정의하거나 사용하는 일이 거의 없기 때문에,
스프링이 다양한 형태의 설정 정보를 BeanDefinition으로 추상화해서 사용하는 것 정도만 이해하면 된다.
정리하자면, 스프링 빈을 만들때는 두가지 방법이 있는데,
하나는, 직접적으로 스프링 빈을 등록하는 방법과,
두번째는, factoryBean을 통해서 등록하는 것인데, javaConfig를 쓰는게 이 방법인 것이다.
'개발자 공부 - 인프런 온라인 강의 > 스프링 핵심 원리 - 기본편' 카테고리의 다른 글
[섹션 5. 싱글톤 컨테이너] 싱글톤 방식의 주의점 / 인프런 김영한 스프링 핵심 원리 기본편 (0) | 2023.04.23 |
---|---|
[섹션 5. 싱글톤 컨테이너] 싱글톤 컨테이너 / 인프런 김영한 스프링 핵심 원리 기본편 (0) | 2023.04.22 |
[섹션 5. 싱글톤 컨테이너] 싱글톤 패턴 / 인프런 김영한 스프링 핵심 원리 기본편 (0) | 2023.04.16 |
[섹션 5. 싱글톤 컨테이너] 웹 애플리케이션과 싱글톤 / 인프런 김영한 스프링 핵심 원리 기본편 (0) | 2023.04.15 |
[섹션 4. 스프링 컨테이너와 스프링 빈] 다양한 설정 형식 지원 - 자바 코드, XML / 인프런 김영한 스프링 핵심 원리 기본편 (0) | 2023.04.02 |
[섹션 4. 스프링 컨테이너와 스프링 빈] BeanFactory와 ApplicationContext (+ 스프링 컨테이너의 계층구조) / 인프런 김영한 스프링 핵심 원리 기본편 (0) | 2023.04.01 |
[섹션 4. 스프링 컨테이너와 스프링 빈] 스프링 빈 조회 - 상속 관계 / 인프런 김영한 스프링 핵심 원리 기본편 (0) | 2023.04.01 |
[섹션 4. 스프링 컨테이너와 스프링 빈] 스프링 빈 조회 - 동일한 타입이 둘 이상 / 인프런 김영한 스프링 핵심 원리 기본편 (0) | 2023.03.19 |
댓글