본문 바로가기
Spring|Spring-boot

Spring BeanDefinition

by oncerun 2021. 12. 15.
반응형

레거시 애플리케이션을 접하다 보면 설정을 찾느라 매우 고생하는 경우가 많다. 실제 여기저기서 생성되는 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

댓글