Spring/김영한 스프링 핵심원리 - 기본편
[섹션4-8] 스프링 빈 설정 메타정보 - BeanDefinition
보름달빵
2024. 2. 15. 18:32
지금까지 스프링 컨테이너의 설정을 어노테이션 기반의 자바 코드와 XML파일을 이용해서 해보았다.
그런데 스프링은 어떻게 이렇게 다양한 설정 형식을 지원하는 것일까?
스프링 컨테이너 설정 형식은 어노테이션 기반의 자바 코드도 되고, XML파일로 설정해도 되고, 사용자 임의로 만들어서 설정을 해줘도 된다.
이것이 가능한 이유는 바로 BeanDefinition 이라는 추상화 때문이다.
쉽게말해 역할과 구현을 분리 해줬기 때문에 설정 클래스를 바꿔끼워도 상관이 없었던 것이다.
스프링 컨테이너는 빈 설정과 관련된 설정을 구체적인 설정 클래스들에 의존하고 있는 것이 아닌, BeanDefinition 이라는 인터페이스에 의존하고 있다.
즉, 스프링 컨테이너는 설정 클래스가 자바 코드인지, XML인지 몰라도 된다. 오직 BeanDefinition만 알면 된다.
- @Bean , <bean> 당 각각 하나씩 메타 정보가 생성된다.
- 스프링 컨테이너는 이 메타정보를 기반으로 스프링 빈을 생성한다.
조금 더 자세하게 설명해보자면
- AnnotationConfigApplicationContext 는 AnnotatedBeanDefinitionReader 를 이용해 AppConfig.class 를 읽고 BeanDefinition을 생성한다.
- GenericXmlApplicationContext는 Xml BeanDefinitionReader를 이용하여 appConfig.xml을 읽고 BeanDefinition을 생성한다.
beandefinitionTest
- 빈 설정 메타 정보 확인해보는 테스트 코드 작성
public class beanDefinitionTest {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
GenericXmlApplicationContext gc = new GenericXmlApplicationContext("appConfig.xml");
@Test
@DisplayName("자바 코드 기반의 빈 설정 메타정보 확인")
void findBeanApplicationBean(){
String[] beanDefinitionNames = ac.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
// 각각의 빈들의 BeanDefinition 확인하기
BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);
if(beanDefinition.getRole()== BeanDefinition.ROLE_APPLICATION){
System.out.println("beanDefinitionName = " + beanDefinitionName+
"beanDefinition = "+beanDefinition);
}
}
}
@Test
@DisplayName("XML 기반의 빈 설정 메타정보 확인")
void findBeanApplicationBeanByXML(){
String[] beanDefinitionNames = gc.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
// 각각의 빈들의 BeanDefinition 확인하기
BeanDefinition beanDefinition = gc.getBeanDefinition(beanDefinitionName);
if(beanDefinition.getRole()== BeanDefinition.ROLE_APPLICATION){
System.out.println("beanDefinitionName = " + beanDefinitionName+
"beanDefinition = "+beanDefinition);
}
}
}
}
※ 참고로만 알아두기
정리
- BeanDefinition 에 대해서는 간단하게만 알아두자
- 스프링이 다양한 설정 방식을 지원할 수 있는 이유는 구체적인 설정 클래스가 아닌 BeanDefinition 이라는 추상화에 의존하고 있기 때문인 것이다.
- 스프링 빈을 등록하는 방법에는 두가지가 있다.
- XML 형식으로 직접적으로 등록하거나
- 자바 코드(Appconfig.class) 로 factoryBean을 이용하는 것이다.