Development/Spring Boot
[Spring Boot] 스프링 빈 설정 메타 정보 - BeanDefinition (중요)
sky Jeong
2022. 8. 15. 16:00
1- 스프링은 어떻게 다양한 설정 형식을 지원하나?
- BeanDefinition 이라는 추상화가 존재하기 때문
- 쉽게 이야기해 역할과 구현을 개념적으로 나눈 것
- [ XML 혹은 자바 코드 ]를 읽어 BeanDefinition을 만들면 됨
- 스프링 컨테이너는 설정 파일 형식이 자바 코드인지, XML인지 몰라도 됨. 오직 BeanDefinition만 알면 됨.
- BeanDefinition을 빈 설정 메타정보라 함
@Bean, <bean>당 각각 하나씩 메타 정보가 생성됨 - 스프링 컨테이너는 이 메타정보를 기반으로 스프링 빈을 생성함
스프링 컨테이너 내부는 추상화에만 의존하도록 설계되어 가능한 것.
2- 코드 레벨로 들어가 살피기
- AnnotationConfigApplicationContext는 AnnotatedBeanDefinitionReader를 사용해 AppConfig.class를 읽고,
BeanDefinition을 생성함 - GenericXmlApplicationContext는 XmlBeanDefinitionReader를 사용해 appConfig.xml을 읽고,
BeanDefinition을 생성함 - 새로운 형식 설정 정보가 추가된다면 OOOBeanDefinitionReader를 만들어 BeanDefinition을 생성하면 됨.
왜? 스프링 컨테이너는 BeanDefinition으로 스프링 빈을 생성하게 설계되어 있기에. 반드시 BeanDefinition을 생성해줘야 함
3- BeanDefinition 살펴보기
- BeanDefinition 정보
- BeanClassName : 생성할 빈의 클래스 명( 자바 설정 처럼 팩토리 역할의 빈을 사용하면 없음 )
- factoryBeanName : 팩토리 역할의 빈을 사용할 경우 이름. (ex. appConfig )
- factoryMethodName : 빈을 생성할 팩토리 메서드 지정. (ex. memberService )
- Scope: 싱글톤 (기본 값)
- lazyInit: 스프링 컨테이너 생성시 빈을 생성하는 것이 아닌, 실제 빈을 사용할 때까지 최대한 생성 지연 처리
- InitMethodName: 빈을 생성하고 의존관계를 적용한 뒤 호출되는 초기화 메서드 명
- DestroyMethodName: 빈의 생명주기가 끝나 제거하기 직전에 호출되는 메서드명
- Constructor arguments, Properties: 의존관계 주입에서 사용 ( 자바 설정 처럼 팩토리 역할의 빈을 사용하면 없음 ) - BeanDefinition 출력 예시
4- 정리
- BeanDefinition을 직접 생성해 스프링 컨테이너에 등록할 수 있음. 허나 실무에서 BeanDefinition을 직접 정의하거나 사용할 일은 거의 없음.
- BeanDefinition에 대해 깊게 이해하기 보다는, 스프링이 다양한 형태의 설정 정보를 BeanDefinition으로 추상화해 사용하는 것
정도만 이해하면 됨 - 가끔 스프링 코드나 스프링 관련 오픈 소스를 볼 때, BeanDefinition이 보일때가 있는데 이런 메커니즘을 떠올리면 됨
- GenericXmlApplicationContext => 클래스 루트까지 정보가 상세하게 나옴
- AppConfig.java => 팩토리 메서드를 통해 설정 정보를 제공하는 방식