해당 포스팅은 김영한 님의 인프런 강의 "스프링 핵심 원리 - 기본편" 을 통해 얻은 지식을 정리한 자료 입니다.
[참고 자료]
1. 스프링 컨테이너의 스프링 빈 생성과정
"ApplicationContext" 는 인터페이스 로서, '스프링 컨테이너' 라고 보아도 무방하다.
이를 구현한 것 중 하나가 "AnnotationConfigApplicationContext" 이다.
(어노테이션 기반의 자바설정 클래스로 이를 활용하여 스프링 컨테이너를 만든다.)
(정확하게는 "AnnotationConfigApplicationContext"는 'AppConfig.class' 와 같은 자바형태의 빈 구성정보 파일을 활용하여, 스프링 컨테이너를 생성한다.)
스프링 컨테이너 생성과정
※ 'AppConfig.class' 와 같은 자바 형태의 빈 구성정보 파일을 사용하는 경우로 설명한다.
0. 빈 설정 파일 생성
<TestConfigByJava.class>
설명을 위해 임의로 생성한 자바 기반 config 파일.
빈으로 'memberRepository1', 'memberRepository2', 'orderService1' , 'discountPolicy' 를 등록한다.
1. 스프링 컨테이너 생성
* 스프링 컨테이너는 'TestConfigByJava.class' 를 기반으로 생성한다.
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(TestConfigByJava.class);
스프링 컨테이너가 생성됨과 동시에 스프링 빈 저장소가 함께 생성된다.
2. 스프링 빈 등록하기
"TestConfigByJava.class" 구성 정보를 통해, 스프링 컨테이너가 스프링 빈 저장소를 채운다.
생성된 애플리케이션 스프링 빈을 보면,
config 클래스인 'springContainer.TestConfigByJava' ,
'memberRepository1' ,
'memberRepository2' ,
'orderService1' ,
'discountPolicy'
이 생성된 것을 볼수 있다.
※ 기본적으로 메서드 이름이 스프링 빈 이름으로 설정된다. (별도 설정도 가능하다. 중복은 절대 금지!)
※ 메서드의 반환 객체가 해당 빈 객체가 된다.
※ 사실상 " 1. 스프링 컨테이너 생성 " 과 " 2. 스프링 빈 등록하기 "는 동시에 일어난다.
3. 스프링 빈 의존관계 설정
빈 사이의 의존관계를 설정 한다.
스프링 빈 구성 정보 파일인 "TestConfigByJava.class" 에 따라 '스프링 빈' 간의 의존관계가 설정된다.
2. 다양한 형식의 스프링 빈 구성 정보 파일 지원 과정
스프링은 다양한 형식의 스프링 빈 구성 정보 파일을 지원한다.
스프링은 스프링 빈 설정 메타 정보를 담고 있는 'Bean Definition' 을 읽고, 스프링 빈을 생성한다.
xxx.class , xxx.xml 등 다양한 형식의 파일 이더라도, 'Bean Definition' 만 만들어 진다면, 스프링은 빈을 생성할 수 있다.
따라서, 스프링 컨테이너 입장에서는 config 파일(빈 구성정보)이 어떠한 형식이던 상관 없다!
대표적으로 빈 구성정보 파일 형식은 'JAVA 파일' , 'XML' 파일 2가지 이다.
스프링 빈 구성 정보 파일이 Bean 으로 등록되는 과정은 다음과 같다.
"ApplicationContext"는 인터페이스 로서, 추상화 되어있다. (스프링 컨테이너 역할)
이를 JAVA 파일 형태(어노테이션 형식)을 지원하도록 구체화 한 클래스가
"AnnotaionConfigApplicationContext" 이다.
(xxx.class 형식) 등록 과정은 다음과 같다.
1. "AnntatedBeanDefinitionReader"가 "TestConfigByJava.class"의 설정 정보를 읽어온다.
2. "AnntatedBeanDefinitionReader"는 읽어온 정보를 바탕으로 빈 메타 정보인 'BeanDefinition'를 생성한다.
3. "AnnotaionConfigApplicationContext" 는 'BeanDefinition' 을 읽어 스프링 빈을 생성한다.
xxx.xml 형식도 동일하다.
다만 xml 파일 형태를 지원하도록 하는 별도의 클래스가 역할을 수행한다.
사용자가 별도의 형식을 지원하도록 설정할 수도 있다.
'Spring' 카테고리의 다른 글
[Spring] ComponentScan (컴포넌트 스캔) (0) | 2023.11.18 |
---|---|
[Spring] 싱글톤(Singleton) 과 스프링 컨테이너 (0) | 2023.11.12 |
[Spring] 스프링 빈 조회 테스트(이름 / 타입 / 중복 조회) (0) | 2023.11.07 |
[Spring] 순수 JAVA 코드에서 Spring으로 전환하기 (1) | 2023.11.06 |
[Spring] 'IoC', 'DI', 'Spring Container' (0) | 2023.11.05 |