Spring/스프링 핵심 원리 - 기본편

스프링 컨테이너와 스프링 빈 - 다양한 설정 형식 지원 - XML로 AppConfig 설정하기

코징 2022. 3. 15. 17:03

현재는 많이 사용하지 않지만 과거에는 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를 통해서 받고 무엇이 와도 동작이 되도록 잘 설계가 되어있었다. 이를 통해 확장성이 얼마나 용이한지 다시 한번 느끼는 강좌였다.

 

이 글은 인프런의

제목 : 스프링 핵심원리 기본편

강사 : 김영한 님의 동영상을 참조해 만들었습니다.