Go, Vantage point
가까운 곳을 걷지 않고 서는 먼 곳을 갈 수 없다.
Github | https://github.com/overnew/
Blog | https://everenew.tistory.com/
티스토리 뷰
* 김영한님의 스프링 핵심원리 기본편 강좌를 수강하며 정리한 글입니다. *
이전 글에서는 스프링 빈의 조회 방법에 대해 알아 보았다.
이전에 스프링 컨테이너를 ApplicationContext(interface class)라고 하였다.
ApplicationContext도 최상위 인터페이스를 상속하는데, 그것이 바로 BeanFactory이다.
사실 빈의 관리와 검색기능은 BeanFactory가 제공하고, 어플리케이션 개발에 필요한 부가 기능들을 ApplicationContext가 제공해준다.
실제로 코드를 확인해 보면 ApplicationContext는 기능 제공을 위해 여러가지 interface들을 상속하고 있는 것을 확인할 수 있다.
스프링 컨테이너는 java 뿐만 아니라 다양한 설정 정보 타입을 받아올 수 있다.
자바에서는 AnnotationConfigApplicationContext(설정정보.class)를 통해 @Configation 어노테이션이된 설정 정보 클래스를 컨테이너 정보로 활용한다.
자바 뿐만 아니라 XML 파일로도, 직접 만든 설정 파일로도 설정 정보를 받아올 수 있다. 물론 레거시 프로젝트 이외에는 XML기반 설정은 사용하지 않는다.
이렇게 다양한 설정 형식을 지원할 수 있는 것이 바로 추상화의 역할이다.
BeanDefinition은 빈 설정 메타 정보로, 어떤 형식의 파일이든 읽어서 BeanDefinition를 만들어 주면 자바의 @Bean, XML의 <Bean> 마다 하나씩 매타 정보를 생성되고, 스프링 컨테이너가 이를 기반으로 스프링 빈을 만든다.
즉, 스프링 컨테이너는 BeanDefinition이라는 추상화 인터페이스에 의존하면 된다.
BeanDefinition의 정보들을 getBeanDefinition()으로 직접 출력 해보면 여러가지 정보들이 나온다.
해당 내용들은 결국 추상화이기 때문에 하나 하나 인지할 필요는 없지만, 이러한 정보를 기반으로 스프링 빈이 생성된다고 알아두자.
예를 들어 memberService의 BeanDefinition을 출력하면 다음과 같이 나온다.
Root bean: class [null]; scope=; abstract=false; lazyInit=null; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=appConfig; factoryMethodName=memberService; initMethodName=null; destroyMethodName=(inferred); defined in hello.core.AppConfig
일반적으로 자바의 어노테이션 사용시 factoryBean을 사용한다고 생각하면 된다.
이러한 정보를 new BeanDefinition() 처럼 직접 생성하여 주입도 가능하지만 실무에서는 사용하지 않는다.
'개발 > Spring' 카테고리의 다른 글
[Spring] 8. 컴포넌트와 컴포넌트 스캔 (0) | 2022.06.28 |
---|---|
[Spring] 7. 싱글톤 컨테이너 (0) | 2022.06.26 |
[Spring] 5. 스프링 빈 조회, getBean() (0) | 2022.06.25 |
[Spring] 4. 스프링 컨테이너와 스프링 빈 (0) | 2022.06.23 |
[Spring] 3. 제어의 역전(IoC)과 컨테이너 (0) | 2022.06.23 |