1. BeanFactory와 ApplicationContext
BeanFactory는 Spring에서 사용하는 컨테이너들의 최상위 컨테이너이다.
ApplicationContext는 BeanFactory의 모든 기능들을 상속받을 뿐 아니라, MessageSource, EnvironmentCapable, ApplicationEventPublisher, ResourceLoader 등의 부가기능들을 상속받는다. 그래서 보통 BeanFactory를 사용하기보단 Application Context를 사용한다.
부가기능
- MessageSource : 메시지를 공통화 하고, 다른 국가권에서 접속 시에 언어를 변경해서 출력할 수 있도록 해준다.
- EnvironmentCapable : 로컬, 개발, 운영 등을 구분해서 처리할 수 있도록 해준다. dev, qa, stage 등 DB 및 환경변수에 대한 설정을 유연하게 바꿀 수 있도록 해주는 기능이다.
- ApplicationEventPublisher : 이벤트를 발행하고 구독하는 모델을 지원한다.
- ResourceLoader : 파일, 클래스패스, 외부 등에서 편리하게 리소스를 조회할 수 있도록 한다.
2. xml 방식으로 빈 등록 및 조회해보기
지금까지는 어노테이션 기반의 AnnotationConfigApplicationContext 컨테이너를 사용하였다. 하지만 위 컨테이너 상속관계 도식에서 볼 수 있듯이 GenericXmlApplicationContext 외 다른 컨테이너들도 이용할 수 있다. xml 방식을 한 번 사용해보자.
xml은 코드가 아니고 문서인데, 이 문서를 읽어들이는 방식을 예전에는 많이 사용했다고 한다. 하지만 작성량이 많아 사용하기 불편하고 가독성이 떨어져서 최근에는 어노테이션 기반 방식을 선호한다고 한다. 나중에 이 어노테이션 방식에서는 빈들을 자동주입 하는 방식을 사용한다.
xml 방식의 컨테이너를 정의하고 테스트
appConfig.xml 파일 만들기
resources 폴더에 Spring Config로 XML 설정 파일을 만든다.
마치 HTML처럼 tag 형태로 빈을 정의한다. id, class를 작성하고 빈 내부에서 다른 빈을 호출할때는 <constructor-arg>라는 생성자 방식을 이용한다. ref 부분에 다른 빈의 id를 적어주어 참조하도록 한다.
AppConfig.class에서 코드 형식으로 쓴 부분과 대조해보자
3. BeanDefinition
BeanDefinition은 이전 글 9. 빈 조회하기 부분에서 이미 사용했다. BeanDefinition은 빈 메타정보로 빈과 관련된 설정 정보를 담고 있는 객체이다.
AnnotationConfigApplicationContext, GenericXmlApplicationContext 등 모든 컨테이너가 결국에는 BeanDefinition 메타정보를 생성한다. Spring은 미리 만들어놓은 역할(양식)인 BeanDefinition 정보를 갖춰놓고, 여기에 맞는 정보를 각 방식의 컨테이너에 요청하는 것이다. 이런 '역할'을 만들어놓고 구현은 각 컨테이너가 하도록 만들어놓음으로써 객체지향적 방식을 적용해놓은 것이라 이해하면 된다.
참조
1. 인프런_스프링 핵심 원리 기본편_김영한 님 강의
www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard
'Programming-[Backend] > Spring' 카테고리의 다른 글
[스프링 기초] 12. 컴포넌트 스캔(Component Scan) (0) | 2021.07.04 |
---|---|
[스프링 기초] 11. 싱글톤(Singleton) (0) | 2021.06.30 |
[TIL] 커스텀 Exception 만들기 : @ExceptionHandler, @ResponseStatus, @RestControllerAdvice, super() (0) | 2021.06.24 |
[스프링 기초] 9. 빈 조회하기 (0) | 2021.06.15 |
[스프링 기초] 8. 스프링 컨테이너 (0) | 2021.06.14 |