이번 포스트에서는 BeanFactory와 ApplicationContext가 무엇인지 그리고 어떤 관계가 있는지 알아볼 것이다. 또한 다양한 형식의 구성 파일을 자유롭게 사용할 수 있는 이유와 BeanDefinition에 대해서 알아보자.
BeanFactory와 ApplicationContext
BeanFactory는 스프링 컨테이너의 최상위 인터페이스이며, getBean()을 비롯하여 스프링 빈을 관리하고 조회하는 역할을 담당한다.
ApplicationContext는 BeanFactory의 기능을 모두 상속받아서 제공한다. 동시에 다른 여러 가지 인터페이스를 상속받으며 기타 많은 부가기능을 제공한다. 몇 가지 예를 들자면 환경변수 관리, 애플리케이션 이벤트, 편리한 리소스 조회 기능 등이 있다.
정리하자면 ApplicationContext는 빈을 관리하고 조회하는 기능을 BeanFactory에게서 상속받아서 제공하며, 거기에 더해서 편리한 부가 기능을 제공한다. 따라서 웬만하면 부가기능이 포함된 ApplicationContext를 사용하게 된다. BeanFactory나 ApplicationContext를 스프링 컨테이너라고 부른다.
다양한 설정 형식 지원 - 자바 코드, XML
스프링 컨테이너는 다양한 형식의 설정 정보를 지원하도록 유연하게 설계되어 있다. 앞서 우리가 사용했던 AnnotationConfigApplicationContext 클래스는 자바 코드로 짜인 AppConfig 파일을 이용해서 설정 정보를 읽는다.
현재는 잘 사용하지 않지만 이전에는 XML 형식의 설정 파일을 많이 사용했다.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="memberService" class="hello.core.member.MemberServiceImpl">
<constructor-arg name="memberRepository" ref="memberRepository"/>
</bean>
<bean id="memberRepository" class="hello.core.member.MemoryMemberRepository"/>
</beans>
GenericXmlApplicationContext 클래스는 위와 같은 XML 설정 파일을 이용해서 설정 정보를 읽는다. 자바, XML 외에도 원하는 형식의 설정 파일을 읽을 수 있도록 XxxApplicationContext 클래스를 구현해서 사용할 수 있다.
이렇게 다양한 형식의 설정 파일을 지원할 수 있는 이유는 BeanDefinition이라는 추상화이다.
XML을 읽어서 BeanDefinition을 만들고, 자바 코드를 읽어서 BeanDefinition을 만들면 된다. 그러면 스프링 컨테이너는 설정 파일이 자바인지, XML인지 몰라도 되며, 오직 BeanDefinition만 알면 된다. 이전에 배운 역할과 구현의 분리와 같은 원리이다.
AnnotationConfigApplicationContext 클래스는 AppConfig.class를 이용해서 빈 메타정보 BeanDefinition를 생성하고, GenericXmlApplicationContext 클래스는 appConfig.xml을 이용해서 빈 메타정보 BeanDefinition을 생성하는 것이다.
BeanDefinition을 빈 설정 메타정보라고 하며, @Bean(또는 <bean>)당 각각 하나씩 메타 정보가 생성된다. 스프링 컨테이너는 이 메타정보를 기반으로 스프링 빈을 생성하는 것이다. BeanDefinition 정보에는 BeanClassName, factoryBeanName 등이 저장된다.
이 포스트는 인프런의 [스프링 핵심 원리 - 기본편] (김영한) 강의를 수강하고 정리한 글입니다.
'Java > [스프링 핵심 원리]' 카테고리의 다른 글
[스프링 핵심 원리] 컴포넌트 스캔(@ComponentScan) (0) | 2021.12.12 |
---|---|
[스프링 핵심 원리] 싱글톤 컨테이너와 @Configuration (0) | 2021.12.11 |
[스프링 핵심 원리] 스프링 컨테이너와 스프링 빈 (0) | 2021.12.07 |
[스프링 핵심 원리] JAVA 프로젝트에 OOP 원리 적용하기 (SRP, OCP, DIP) (0) | 2021.12.05 |
[스프링 핵심 원리] 객체 지향 SOLID 원칙과 Spring의 관계 (0) | 2021.12.03 |
댓글