Search
Duplicate

[스프링 핵심원리 기본] 스프링 컨테이너와 스프링 빈 - 다양한 설정 혁시 지원 - XML로 AppConfig 설정하기

상태
스프링 핵심원리 기본
담당자
속성 1
Spring
JAVA
속성
6
현재는 많이 사용하지 않지만 과거에는 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>
Java
복사
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); } }
Java
복사
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를 통해서 받고 무엇이 와도 동작이 되도록 잘 설계가 되어있었다. 이를 통해 확장성이 얼마나 용이한지 다시 한번 느끼는 강좌였다.
이 글은 인프런의
제목 : 스프링 핵심원리 기본편
강사 : 김영한 님의 동영상을 참조해 만들었습니다.