스프링 빈 설정 메타 정보 - BeanDefinition
스프링에서 어떻게 다양한 설정 형식을 지원할 수 있을까?
BeanDefinition 이라는 추상화가 그 중심에 있다.
역할과 구현을 개념적으로 나눈다.
- XML을 읽어서 BeanDefinition을 만들면 된다.
- 자바 코드를 읽어서 BeanDefinition을 만들면 된다.
- 스프링 컨테이너는 자바 코드인지, XML인지 몰라도 된다. 오직 BeanDefinition만 알면 된다.
BeanDefinition 을 빈 설정 메타정보라 한다.
- @Bean , <bean>(xml) 당 각각 하나씩 메타 정보가 생성된다.
스프링 컨테이너는 이 메타정보를 기반으로 스프링 빈을 생성한다.
스프링 컨테이너 자체는 BeanDefinition에만 의존한다.
스프링 컨테이너는 추상화에만 의존하도록 설계됨
➡️ BeanDefinition 자체가 interface다.
ApplicationContext를 구현한 AnnotationConfig ApplicationContext 는
Annotated BeanDefinitionReader를 사용해서
AppConfig.class(어플리케이션 설정 정보)를 읽고 BeanDefinition 을 생성한다.
GenericXmlApplicationContext 는 XmlBeanDefinitionReader 를 사용해서
appConfig.xml 설정 정보를 읽고 BeanDefinition 을 생성한다.
새로운 형식의 설정 정보가 추가되면,
XxxBeanDefinitionReader를 만들어서 BeanDefinition 을 생성하면 된다.
BeanDefinitionTest
AppConfig를 가지고 BeanDefinition 이라는 설정 정보를 만든다.
빈 설정 메타정보 확인
할당이 안되어있다 → 싱글 톤
* test 결과에 대한 BeanDefinition 정보는 pdf 참고
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
//GenericXmlApplicationContext ac = new GenericXmlApplicationContext("appConfig.xml");
참고로 ApplicationContext 로 안하고
AnnotationConfigApplicationContext or GenericXmlApplicationContext 로 작성한 이유는
getBeanDefinition을 사용하지 못하기 때문이다.
ApplicationContext 는 getBeanDefinition이 없다.
정리
BeanDefinition 이라는 것으로 스프링 빈의 설정 메타 정보를 추상화 한다.
스프링 빈을 만들 때는 2가지 방법이 있는데
직접 스프링 빈에 등록하는 방법과 appConfig.xml
factoryBean 을 통해서 등록하는 방법이 있다. AppConfig
일반적으로 자바 config를 쓰는 것은 factoryBean 이라는 것을 통해서 등록하는 방식이다.
웹 애플리케이션과 싱글톤
자바 JVM 안에 딱 하나만 있어야 되는 객체 인스턴스 패턴을 싱글톤이라고 한다.
대부분의 스프링 애플리케이션은 웹 애플리케이션이다.
문제점
웹 애플리케이션은 보통 여러 고객이 동시에 요청을 한다.
계속 요청이 올 때마다 객체를 계속 만들어야 한다.
스프링 없는 순수한 DI 컨테이너 테스트
memberService1과 memberService2는 다르게 생성이 된다.
JVM 메모리에 객체가 계속 생성되어 올라갈 것이다.
정리
우리가 만들었던 스프링 없는 순수한 DI 컨테이너인 AppConfig는
요청을 할 때 마다 객체를 새로 생성한다.
고객 트래픽이 초당 100이 나오면 초당 100개 객체가 생성되고 소멸된다 → 메모리 낭비가 심하다.
해결방안은 해당 객체가 딱 1개만 생성되고, 공유하도록 설계하면 된다. → 싱글톤 패턴
'WIL' 카테고리의 다른 글
29주차 - 탐색 위치와 기본 스캔 대상 (1) | 2022.04.03 |
---|---|
28주차 (0) | 2022.03.27 |
26주차 - 컨테이너에 등록된 모든 빈 조회 (0) | 2022.03.13 |
25주차 (0) | 2022.03.06 |
24주차 - commit 기록 지우기 (0) | 2022.02.27 |