스프링/SpringBasicCore

Section4(3편) BeanDefinition

나는웅쓰 2024. 2. 20. 09:25
인프런 강의 中 
김영한 강사님의 '스프링 핵심 원리' 내용을 정리했습니다.

이번 시간에는 다양한 형식으로 빈 설정 정보를 등록할 수 있게 해주는 BeanDefinition에 대해 김영한 강사님의 강의를 바탕으로 정리해보겠다.

 

BeanDefinition

BeanDefinition의 관계

 

김영한 강사님의 강의를 열심히 들었다면 위 구조를 보고 역할과 구현으로 나누어진 구조라는 것을 알아챘을 것이다. BeanDefinition이 역할을 담당하고 AppConfig가 구현을 담당하고있다. 그리고 스프링 컨테이너는 BeanDefinition에 의존하고 있다.

이전 강의에서 AppConfig가 빈 설정 정보를 가지고 있고 파일 안의 내용을 기준으로 스프링 컨테이너에 빈 설정 정보를 등록해준다고 했는데 정작 스프링 컨테이너는 BeanDefinition에 의존하고 있다. 왜일까?

사실, 스프링 컨테이너는 빈 설정 정보를 등록할 때 구현체 파일인 AppConfig에 의존하지 않고 BeanDefinition인 인터페이스에만 의존하다 보니 각 파일이 어떤 종류든 상관없이 빈 설정 정보를 컨테이너에 등록할 수 있다.

여기까지 따라왔으면 스프링 컨테이너가 인터페이스인  BeanDefinition에 의존해서 빈 설정 정보를 등록했다는 것을 흐름으로 파악했을 것이다. 그럼 이제 BeanDefinition의 개념을 살펴보자.

 

BeanDefinition 개념

  • 스프링이 다양한 설정 형식을 지원하게 해줄 수 있었던 빈 설정 메타 정보이며 추상화 역할을함. 
  • XML, 클래스 파일 등을 읽어서 BeanDefinition을 만듦.
  • 스프링 컨테이너는 BeanDefinition만 알면 되기 때문에 구현체가 클래스 파일인지. XML 파일인지 몰라도 되고 어떤걸로 작성 되었어도 상관 없음.
  • 구현체 파일에서 @Bean, <bean> 당 각각 하나씩 메타 정보가 생성된다.
    • ex) AppConfig.java 파일에서 @Bean을 4번 사용해서 메소드를 만들었다면 BeanDefinition은 4개가 생성됨.

 

BeanDefinition 정보

  • BeanClassName: 생성할 빈의 클래스명(자바 설정 처럼 팩토리 역할의 빈을 사용하면 없음)
  • factoryBeanName: 팩토리 역할의 빈을 사용할 경우 이름 ex) appConfig
  • factoryMethodName: 빈을 생성할 팩토리 메서드 지정 ex) memberService
  • Scope: 싱글톤(기본값)
  • lazyInit: 스프링 컨테이너를 생성할 때 빈을 생성하는 것이 아니라, 실제 빈을 사용할 때 까지 최대한 생성을 지연처리 하는

 

코드 레벨에서의 BeanDefinition

BeanDefinition을 포함한 빈 등록 관계도

 

우리가 지금까지 사용했던 코드가 어떻게 의존되어있고 어떤 순서로 빈 설정 정보를 등록했는지 보여주는 관계도이다. 위 이미지대로 파일을 열어보자.

 

AnnotationConfigApplicationContext.java

public class AnnotationConfigApplicationContext extends GenericApplicationContext implements AnnotationConfigRegistry {
    private final AnnotatedBeanDefinitionReader reader;
    private final ClassPathBeanDefinitionScanner scanner;
	...
}

 

AnnotationConfigApplicationContext 파일을 열어보면 필드 부분에 AnnotationBeanDefinitionReader가 선언된 것을 확인할 수 있다. 이 부분에서 위 이미지와 같이 설정 정보를 읽어서 BeanDefinition을 생성해준다.

 

GenericXmlApplicationContext.java

public class GenericXmlApplicationContext extends GenericApplicationContext{
	private final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this);
....
}

 

GenericXmlApplicationContext에서는 XmlBeanDefinitionReader가 appConfig.xml 설정 정보를 읽고 BeanDefinition을 생성한다.

 

이렇게 빈 설정에 대해서 알아보았다. 다음 Section에서부터는 스프링 컨테이너에서 자동으로 만들어주는 Singleton에 대해서 김영한 강사님의 강의를 바탕으로 공부해보자!