목표

1. 스프링 컨테이너가 지원하는 설정 형식을 배운다. - 자바코드 와 XML
2. 스프링 빈 설정 메타 정보를 배운다. 

'스프링 컨테이너와 스프링 빈' 목차

1. 스프링 컨테이너 생성  

2. 컨테이너에 등록된 모든 빈 조회

3. 스프링 빈 조회 - 기본

4. 스프링 빈 조회 - 동일한  타입이 둘 이상 

5. [ 중요 ] 스프링 빈 조회 - 상속 관계

6. BeanFactory와 ApplicationContext 

7. 다양한 설정 형식 지원 - 자바 코드, XML (이번 포스팅)

8. 스프링 빈 설정 메타 정보 - BeanDefinition


7.  다양한 설정 형식 지원 - 자바 코드, XML

스프링 컨테이너는 다양한 설정 형식을 지원한다. 

자바 코드, XML, Groovy 등등.. 

애노테이션 기반 자바 코드로 설정

지금까지 애노테이션 기반 자바 코드로 설정(팩토리 빈으로 설정)하는 법을 배웠다.

AppConfig라는 팩토리 빈에서 @Bean 애노테이션이 달린 팩토리 메서드를 통해 스프링 빈을 스프링 컨테이너에 등록하는 방식이다. 

AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);

XML로 설정

이번 시간에는 XML로 설정 해보자. 최근에는 스프링 부트를 많이 사용하면서 이 방식은 드물게 쓰고 있고, 레거시 프로젝트들에서 주로 사용한다. XML을 사용하면 컴파일 없이 빈 설정 정보를 변경할 수 있다는 장점이 있다.

 

1) resource 디렉토리에 appConfig.xml 을 작성한다. 

스프링 빈의 id, class, constructor-arg 등 으로 구성되어 있다. 이 때, class의 전체 경로를 적어줘야 한다.

내용은 자바 코드와 똑같은데 형식이 약간 다를 뿐이다. 

xml 기반 방식은 직접 스프링 빈을 스프링 컨테이너에 등록하는 방식이다. 

2) GenericXmlApplicationContext 에 appConfig.xml 설정 정보를 넘겨서 스프링 컨테이너를 생성한다. 

테스트 코드를 작성해서 memberService 빈을 조회해보자. 

xml 기반으로 설정하는 것은 최근에 잘 안쓰니까 이정도로 마무리하고. 필요하면 레퍼런스 문서를 확인하자. 


8. 스프링 빈 설정 메타 정보 - BeanDefinition

조금 깊이 있는 내용으로 가보자.  

1) 스프링은 어떻게 이런 다양한 설정 형식을 지원하는 것일까? 그 중심에는 BeanDefinition  이라는 추상화가 있다. 

  • 즉, 역할과 구현을 개념적으로 나눈 것이다. 
    • XML 을 읽어서 BeanDefinition을 만들면 된다. 
    • 자바 코드를 읽어서 BeanDefinition을 만들면 된다.
    • 스프링 컨테이너는 자바 코드인지 XML 인지(구현은) 몰라도 된다. 오직 BeanDefinition만(역할만) 알면 된다. 

역할과 구현을 개념적으로 나눈 것

  • BeanDefinition 을 빈 설정 메타정보라 한다. 
  • 이 메타정보를 기반으로 인스턴스를 생성한다. 
  • BeanDefinition 자체가 인터페이스다. 스프링 컨테이너는 인터페이스만 바라본다.
    • @Bean , <bean> 당 각각 하나씩 메타정보가 생성된다. 이 메타정보를 기반으로 스프링 빈을 생성한다. 

2) 코드 레벨로 들어가보자. 

아유 잘 모르겠다 싶으면 몰라도 된다. 개발에 아~무 지장없다. 

설정 형식 마다 Reader가 있다! 

  • ApplicationContext 인터페이스에는 설정 파일을 읽기 위한 여러 구현체들이 있다. 
  • 자바 코드 설정을 읽을 Reader == AnnotatedBeanDefinitionReader 가 있다. 얘가 AppConfig.class 파일을 읽어서 빈 메타정보를 생성한다. 
  • xml 형식의 설정을 읽을 XmlBeanDefinitionReader 가 있다. 얘가 appConfig.xml을 읽어서 빈 메타정보를 생성한다. 
  • 새로운 형식의 설정 정보가 추가되면, 또는 개발자가 새 형식의 설정 정보를 추가하면, XxxBeanDefinitionReader를 만들어서 BeanDefinition을 생성할 수 있다. 

[ 정리 ] 

스프링이 다양한 형태의 설정 정보를 BeanDefinition으로 추상화해서 사용하는 것 정도만 이해하면 된다. 

스프링 관련 오픈 소스를 보다가 BeanDefinition 이 보일 것이다. 이 때 이러한 매커니즘을 떠올리면 된다. 


다음 강의에서는 객체가 JVM안에 딱 하나만 있어야되는 '싱글톤 컨테이너와 싱글톤 방식의 주의점'를 배운다. 

공부 내용 출처 :  스프링 핵심 원리 기본편 

728x90

+ Recent posts