[김영한님의 스프링 핵심 원리-기본편을 학습 후 정리한 내용입니다.]
스프링 컨테이너의 생성 & 스프링 빈 등록 과정
스프링 컨테이너는 먼저 아래와 같이 생성된다.
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(Appconfig.class);
- ApplicationContext(인터페이스) : 스프링 컨테이너
- AnnotationConfigApplicationContext : ApplicationContext의 구현체
스프링 컨테이너는 파라미터로 넘어온 클래스 정보(여기서는 Appconfig)를 사용해서 스프링 빈을 등록한다.
Appconfig의 4가지 메서드의 이름이 빈 이름이 되고, 빈 객체는 클래스명이 된다.
스프링 컨테이너는 AppConfig.class의 설정정보를 참고해서 의존관계를 주입하게 된다.
BeanFactory, ApplicationContext 둘 중 어떤 게 스프링컨테이너일까?
결론을 먼저 말하면, 둘 다 스프링컨테이너이다. 사실 스프링 컨테이너를 부를 때 BeanFactory, ApplicationContext로 구분해서 얘기한다. 그럼에도 우리는 일반적으로 ApplicationContext를 스프링 컨테이너라고 한다. 그 이유는 아래내용에서 설명한다.
BeanFactory는 스프링 컨테이너의 최상위 인터페이스이다. BeanFactory는 getBean()을 제공하는 등 스프링 빈을 관리하고 조회하는 역할을 담당한다.
ApplicationContext는 위 그림과 같이 BeanFactory인터페이스를 상속받는 인터페이스이다. 즉, BeanFactory의 기능 외에도 수많은 부가기능을 정의한 인터페이스이다. 따라서 개발을 하는 우리들에게는 BeanFactory를 직접 사용한다기 보다는 부가기능이 포함된 ApplicationContext를 사용한다.
ApplicationContext가 제공하는 부가기능은 다음 그림을 참고하자.
다양한 설정 형식을 지원하는 스프링 컨테이너
위에 스프링컨테이너를 생성했던 코드를 다시 살펴보자.
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(Appconfig.class);
우리는 자바 코드로 작성한 Appconfig클래스를 구성정보로 하는 스프링 컨테이너를 생성했다.
다양한 설정 형식을 지원하는 스프링 컨테이너는 자바 외에도 XML, Groovy 등 다양한 언어에 대해서 받아들일 수 있게 유연하게 설계되어 있다. (물론 각 언어에 따라서 달라지는 것이 있다. 가령 XML을 설정파일로 만들려고 한다면, 위에 보이는AnnotationConfigApplicationContext구현체가 아닌 GenericXmlApplicationContext를 사용하여 스프링 컨테이너를 생성해야 한다.)
그렇다면 스프링은 어떻게 이렇게 다양한 설정형식을 모두 지원해주는 걸까? 바로 BeanDefinition이라는 추상화를 이용한다. 스프링 컨테이너는 설정파일이 자바코드인지, XML인지 몰라도 된다. 오직 각각의 파일들로부터 만들어진 빈 설정 메타정보(BeanDefinition)만 알면 된다.
과정을 설명하기 위해서 위 그림의 굵게 표시된 경로를 보자. 만약 우리가 자바코드로 AppConfig를 구성했다면 AnnotationConfigApplicationContext는 AnnotatedBeanDefinitionReader를 사용해서 AppConfig를 읽고 BeanDefinition을 생성한다.
마찬가지로 우리가 xml로 appConfig을 구성했다면 GenericXmlApplicationContext는 XmlBeanDefinitionReader를 사용하여 appConfig.xml을 읽고, BeanDefinition을 생성한다. 즉, 스프링은 다양한 형태의 설정 정보를 BeanDefinition으로 추상화해서 사용하며 관리한다.
'Frameworks > Springboot' 카테고리의 다른 글
[Springboot] 컴포넌트 스캔과 의존관계 자동주입 정리 (0) | 2022.07.25 |
---|---|
[Springboot] 싱글톤 컨테이너 개념 정리 (0) | 2022.07.24 |
[Springboot] 객체 지향 설계를 위한 AppConfig 구성 (0) | 2022.07.22 |
[Springboot] 좋은 객체 지향 프로그래밍과 스프링 (0) | 2022.07.20 |
[Springboot] JUnit 통합테스트 개념 정리 (0) | 2022.07.08 |
댓글