Spring 핵심 원리 #7- 스프링 컨테이너 관련 인터페이스
Web/Java (Spring+JSP)

Spring 핵심 원리 #7- 스프링 컨테이너 관련 인터페이스

#BeanFactory & ApplicationContext

1) BeanFactory

- 스프링 컨테이너의 최상위 인터페이스로, 스프링 빈을 관리하고 조회하는 역할을 담당한다.

- getBean()을 제공하는 역할을 하며, 우리가 사용했던 대부분의 기능은 BeanFactory가 제공하는 기능이다.

 

2)ApplicationContext

- BeanFactory의 기능을 모두 상속받아서 제공하며, 빈을 관리하고 조회하는 기능은 물론 수많은 부가기능을 제공한다.

EX) 국제화 기능, 환경변수(로컬 환경,개발 환경, 운영 환경을 구분해서 처리), 애플리케이션 이벤트, 편리한 리소스 조회..

- BeanFactory를 직접 사용할 일은 거의 없으며, 부가기능이 포함된 ApplicationContext를 주로 사용한다

 

= BeanFactory혹은 ApplicationContext를 스프링 컨테이너라고 한다.

 

 

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

: 스프링 컨테이너는 다양한 형식의 설정 정보를 받아들일 수 있도록 유연하게 설계되어있다.

1) Annotation 기반 자바 코드 설정 방식 : @Configuration, @Bean

- XML에 비해 훨씬 많이 사용한다.

- AnnotationConfigApplicationContext를 사용하며, 자바 코드로 된 설정 정보를 넘기면 된다.

 

2) XML 설정 사용: <bean>

- 최근에는 스프링 부트를 많이 사용하여 자주 쓰진 않지만 알아두면 좋음.

- GenericXmlApplicationContext를 사용하여 xml 설정 파일을 넘기면 됨.

 

#스프링 빈 설정 메타 정보 - BeanDefinition

- 스프링이 다양한 설정 형식을 지원하는 데에는 BeanDefinition이라는 추상화가 있다.

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

 

- Bean Definition은 빈 설정 메타정보로, @Bean, <Bean> 당 하나의 메타 정보가 생성된다.

- 스프링 컨테이너는 이를 기반으로 스프링 빈을 생성한다.

 

- 실제 작동 방식

- AnnotationConfigApplicationContext는 AnnotatedBeanDefinitionReader를 이용해 AppConfig.class를 읽고, BeanDefinition을 생성한다.

-XML 기반 클래스도 위와 같은 과정을 통해 BeanDefinition을 만든다.

 

BeanDefinition은 위와 같은 정보를 갖고 있다.

 

- 이전에 beanDefinition의 Role을 통해서 자신이 직접 등록한 스프링 빈만을 출력하거나, 전체 모든 빈을 출력할 수 있었다.

@Test
@DisplayName("빈 설정 메타정보 확인") 
void findApplicationBean() {
	String[] beanDefinitionNames=ac.getBeanDefinitionNames();
    for (String beanDefinitionNames: beanDefinitionNames){
    	BeanDefinition beanDefinition=ac.getBeanDefinition(beanDefinitionName);
        
        if(beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION){
        System.out.println("beanDefinitionName" + beanDefinitionName +
						" beanDefinition = " + beanDefinition);
        }
    }
}

 

 

- BeanDefinition에 대해선 스프링이 다양한 형태의 설정 정보를 BeanDefinition으로 추상화하여 사용한다는 것 정도만 알아두자!