레거시 애플리케이션을 접하다 보면 설정을 찾느라 매우 고생하는 경우가 많다. 실제 여기저기서 생성되는 Bean들을 한눈에 파악하기 매우 힘든 상황이 존재했다. 이 경우 Spring BeanDefinition은 우리에게 Bean에 대한 메타정보들과 등록된 빈을 파악할 수 있도록 도와줄 수 있다.
스프링은 객체지향 프로그래밍을 보조해주는 좋은 프레임워크로 스프링 컨테이너가 관리하는 Bean들을 생성하기 위한 설정 정보도 추상화와 구현체로 나누어 읽어 들이고 생성한다.
이때 BeanDefinition을 빈 설정 메타정보라 한다. 메타정보라 하면 데이터를 위한 데이터라는 뜻을 가지고 있다.
@Test
@DisplayName("BeanDefinition 확인")
void checkBeanMetaData(){
GenericXmlApplicationContext ac = new GenericXmlApplicationContext("appConfig.xml");
String[] beanDefinitionNames = ac.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
System.out.println(beanDefinitionName);
System.out.println(ac.getBeanDefinition(beanDefinitionName));
}
}
간단히 BeanDefinition정보를 알아보자.
Generic bean: class [hello.core.service.MemberServiceImpl];
scope=;
abstract=false;
lazyInit=false;
autowireMode=0;
dependencyCheck=0;
autowireCandidate=true;
primary=false;
factoryBeanName=null;
factoryMethodName=null;
initMethodName=null;
destroyMethodName=null;
defined in class path resource [appConfig.xml]
BeanDefinition 정보
- BeanClassName: 생성할 빈의 클래스 명(자바 설정 처럼 팩토리 역할의 빈을 사용하면 없음)
- factoryBeanName: 팩토리 역할의 빈을 사용할 경우 이름, 예) appConfig
- factoryMethodName: 빈을 생성할 팩토리 메서드 지정, 예) memberService
- Scope: 싱글톤(기본값)
- lazyInit: 스프링 컨테이너를 생성할 때 빈을 생성하는 것이 아니라, 실제 빈을 사용할 때까지 최대한 생성을 지연처리하는지 여부
- InitMethodName: 빈을 생성하고, 의존관계를 적용한 뒤에 호출되는 초기화 메서드 명
- DestroyMethodName: 빈의 생명주기가 끝나서 제거하기 직전에 호출되는 메서드 명
- Constructor arguments, Properties: 의존관계 주입에서 사용한다. (자바 설정 처럼 팩토리 역할의 빈을 사용하면 없음)
예전 XML을 통한 방식은 직접 Bean을 생성하는 방식이며, Annotation을 활용해 Bean을 생성하는 방식을 factoryMethod를 이용한 방식이라고 한다.
이 둘의 차이점은 BeanDefinition 정보에서 실제 class가 노출되느냐 안되느냐 그 차이 뿐이다.
스프링은 추상화된 BeanDefinition에만 의존하며 구현체가 설정 정보를 읽고 빈 메타정보를 생성해서 전달해준다.
XmlBeanDefinitionReader는 실제 전달된 AppConfig.xml 혹은 AnnotationbeanDefinitionReader는 AppConfig.class에서 설정 정보를 읽어서 빈 메타정보를 통해 빈을 생성한다.
AppConfig.xxx라는 것은 BeanDefinition을 개발자가 직접 생성해서 스프링 컨테이너에 등록할 수도 있다.
설정 정보를 읽는 Reader와 AppliactionContext를 ApplicationContext의 interface를 통해 만들 수 있기 때문이다.
스프링은 다양한 형태의 설정 정보를 BeanDefinition으로 추상화해서 사용한다는 점을 알아두자.
'Spring|Spring-boot' 카테고리의 다른 글
핸들러 매핑과 핸들러 어댑터 (0) | 2021.12.25 |
---|---|
싱글톤과 함께 사용하는 프로토타입 문제점 (0) | 2021.12.18 |
Validation (0) | 2021.06.10 |
Spring Transaction(2) (0) | 2021.04.03 |
Spring Transaction (0) | 2021.04.03 |
댓글