목표
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안에 딱 하나만 있어야되는 '싱글톤 컨테이너와 싱글톤 방식의 주의점'를 배운다.
공부 내용 출처 : 스프링 핵심 원리 기본편
'프로그래밍 > Spring Basic' 카테고리의 다른 글
11. @Configuration과 싱글톤 (0) | 2021.12.24 |
---|---|
10. 싱글톤 컨테이너와 싱글톤 방식의 주의점 (0) | 2021.12.24 |
8. 스프링 빈 조회 - 상속 관계 (0) | 2021.12.23 |
7. 스프링 컨테이너 생성 과정 (0) | 2021.12.22 |
6. 객체 지향 원리 적용 - IoC, DI, 그리고 컨테이너 (0) | 2021.12.21 |