현재는 많이 사용하지 않지만 과거에는 XML로 Config설정을 하였었다.
나도 xml 빈 설정을 하는 것을 보고 예전에 학원에서 배웠던 xml 파일이 생각났었다.
Config.java에서 Config.xml로 어떻게 변경하였는지 보자.
1) appConfig.xml의 경로
2) 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"/>
<bean id="orderService" class="hello.core.order.OrderServiceImpl">
<constructor-arg name="memberRepository" ref="memberRepository"/>
<constructor-arg name="discountPolicy" ref="discountPolicy"/>
</bean>
<bean id="discountPolicy" class="hello.core.discount.RateDiscountPolicy"/>
</beans>
3) appConfig.xml 단위 테스트
package hello.core.xml;
import hello.core.member.MemberService;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
import static org.assertj.core.api.Assertions.*;
public class XmlAppContext {
@Test
void xmlAppContext() {
ApplicationContext ac = new GenericXmlApplicationContext("appConfig.xml");
MemberService memberService = ac.getBean("memberService", MemberService.class);
assertThat(memberService).isInstanceOf(MemberService.class);
}
}
4) 스프링 빈 설정 메타 정보 - BeanDefinition
- 스프링은 어떻게 이런 다양한 설정 형식을 지원하는 것일까? 그 중심에는 BeanDefinition이라는 추상화가 있다.
- 역할과 구현을 개념적으로 나눈 것이다.!
- XML을 읽이서 BeanDefinition을 만들고
- 자바 코드를 읽어서 BeanDefinition을 만들면 된다.
- 스프링 컨테이너는 자바 코드인지, XML인지 몰라도 된다. 오직 BenaDefinition만 알면 된다.
- BeanDefinition을 빈 설정 메타 정보라 한다.
- @Bean, <bean> 당 각각 하나씩 메타 정보가 생성된다.
- 스프링 컨테이너는 이 메타정보를 기반으로 스프링 빈을 생성한다.
5) 코드레 벨을 높여 깊이 들어가 보자.
- AnnotationConfigApplicationContext는 AnnotatedBeanDefinitionReader를 사용해서 AppConfig.class를 읽고 BeanDefinition을 생성한다.
- GenericXmlApplicationContext는 XmlBeanDefinitionReader를 사용해서 appConfig.xml을 읽고 BeanDefinition을 생성한다.
- 새로운 형식의 설정 정보가 추가되면, XxxBeanDefinitionReader를 만들어 BeanDefinion을 생성하면 된다.
결론
스프링의 메타정보도 역할과 구현을 구분해서 ApplicationContext는 BeanDefinition만 DI를 통해서 받고 무엇이 와도 동작이 되도록 잘 설계가 되어있었다. 이를 통해 확장성이 얼마나 용이한지 다시 한번 느끼는 강좌였다.
이 글은 인프런의
제목 : 스프링 핵심원리 기본편
강사 : 김영한 님의 동영상을 참조해 만들었습니다.
'Spring > 스프링 핵심 원리 - 기본편' 카테고리의 다른 글
싱글톤 컨테이너 - 싱글톤 방식의 주의 점 (0) | 2022.03.15 |
---|---|
싱글톤 컨테이너 - 웹 애플리케이션을 싱글톤 방식으로 변경 (0) | 2022.03.15 |
스프링 컨테이너와 스프링 빈 - BeanFacotry와 ApplicationContext (0) | 2022.03.15 |
스프링 빈 으로 전환하기 (0) | 2022.03.14 |
AppConfig 리팩터링 (0) | 2022.03.14 |