- 앞서 사용했던 이 코드를 자세히 살펴보면,
- 인터페이스인 ApplicationContext는 스프링 컨테이너라 한다.
- AnnotationConfigApplicationContext는 ApplicationContext의 구현체이다.
- 스프링 컨테이너는 xml 기반 or 어노테이션 기반으로 자바 설정 클래스로 만들 수 있다.( 위에는 어노테이션 기반이다.)
- 최상위에 BeanFactory가 있고, 하위에 ApplicationContext가 있어서 정확히는 스프링 컨테이너를 구분지어 불러야하지만,
사실 직접적으로 BeanFactory를 사용할 일은 거의 없기 때문에 ApplicationContext를 스프링 컨테이너로 부른다.
- BeanFactory
- 스프링 컨테이너의 최상위 인터페이스
- 스프링 빈을 관리하고 조회하는 역할을 담당한다.
- getBean()를 제공한다.
- 지금까지 우리가 사용했던 대부분의 기능은 BeanFactory가 제공하는 기능이다. ( like, getBean() )
- ApplicationContext
- BeanFactory 기능을 모두 상속받아서 제공한다.
- BeanFactory와의 차이점은 애플리케이션을 개발할 때는 빈은 관리하고 조회하는 기능은 물론이고, 수 많은 부가 기능이 필요하다.
- 기능 (Interface)
- MessageSource (메시지소스를 활용한 국제화 기능) :
한국에서 들어오면 한국어로, 영어권에서 들어오면 영어로 출력- EnvironmentCapable (환경 변수) :
로컬, 개발, 운영 등을 구분해서 처리- ApplicationEventPublisher (애플리케이션 이벤트) :
이벤트를 발행하고 구독하는 모델을 편리하게 지원- ResourceLoader ( 편리한 리소스 조회) :
파일, 클래스패스, 외부 등에서 리소스를 편리하게 조회
- 요약 :
- ApplicationContext는 BeanFactory의 기능을 상속받고, 빈 관리기능 + 편리한 부가 기능을 제공한다.
- BeanFactory를 직접 사용할 일은 거의 없다. 부가기능이 포함된 ApplicationContext를 사용한다.
- 그래서 ApplicationContext나 BeanFactory을 스프링 컨테이너라 한다.
1. 스프링 컨테이너 생성
- new AnnotationConfigApplicationContext(AppConfig.class)
- 스프링 컨테이너를 생성할 때는 구성 정보(AppConfig.class)를 지정해줘야한다.
2. 스프링 bean 등록
- 컨테이너는 파라미터로 넘어온 설정 클래스(구성 정보(AppConfig.class))를 사용해서 @Bean이 붙어있는 곳을 확인한 후 등록한다.
- 빈 이름은 메소드 이름을 사용하며 직접사용할 수도 있다. (컨테이너에서는 이 이름을 key로 사용)
- 그리고 컨테이너는 메소드 안에 있는 return 값을 key의 value로 저장한다.
- 빈 이름은 절대 헷갈리지X, 중복X
3. 스프링 빈 의존관계 설정
- 스프링 컨테이너는 설정 정보를 참고해서 의존관계를 주입(DI) 한다.
- 스프링은 빈을 생성하고, 의존관계를 주입하는 단계가 나뉘어있다. (자바 코드로 빈을 등록하면 생성자를 호출하면서 의존관계 주입도 한번에 처리)
- .getBean(빈이름, [타입]), .getBeanOfType(),
- bean 조회 (상속 관계)
- 부모를 조회하면 자식 클래스까지 모두 출력된다.
- 부모 클래스를 조회했을 때 자식이 여러개라면 빈 이름을 지정하면 된다.
- 스프링 컨테이너는 다양한 형식의 설정 정보를 받아드릴 수 있게 유연하게 설계되어 있다. (자바, XML, Groovy 등등)
- ex) BeanFactory - ApplicationContext - AnnotationConfigAppicationContext > AppConfig.class
BeanFactory - ApplicationContext - GenericXmlApplicationContext > appConfig.xml
BeanFactory - ApplicationContext - XxxAplicationContext > appConfig.xxx
- 어노테이션 기반 자바 코드 설정 사용 :
- 여태 해왔던 new AnnotationConfigAppicationContext(AppConfig.class)를 사용하면서 자바 코드로된 설정 정보를 넘기면 된다.)
- XML 설정 사용
- 최근에는 스프링 부트를 많이 사용하면서 XML 기반의 설정은 잘 사용하지 않는다. 아직 많은 레거시 프로젝트들이 XML로 되어 있고, 또 XML을 사용하면
컴파일 없이 빈 설정 정보를 변경할 수 있는 장점도 있으니 먼저 XML로 배워두는 것도 괜찮다.- GenericXmlApplicationContext 를 사용하면서 xml 설정 파일을 넘기면 된다.
- 스프링은 BeanDefinition으로 추상화를 해서 역할과 구현을 개념적으로 나누었다.
- xml, 자바코드 등을 읽어서 BeanDefinition을 만들면 된다. 즉, 스프링 컨테이너는 자바 코드인지, xml인지 몰라도 되고 BeanDefinition만 알면 된다.
- BeanDefinition을 빈 설정 메타정보라고 한다. (@Bean, 당 각가 하니씩 메타 정보가 생성된다.)
- 스프링 컨테이너는 이 메타정보를 기반으로 스프링 빈을 생성한다.
- BeanDefinition은 직접 스프링 빈을 등록하는 방법과 FactoryBean을 통해 등록하는 방법이 있다.
(일반적으로 @Configuration사용은 FactoryBean)