728x90
컨테이너(Container)
- 인스턴스의 생명주기(라이프 사이클)을 관리한다.
- 생성된 인스턴스에 추가적인 기능을 제공한다.
- 톰캣(WAS)은 Servlet 컨테이너를 통해 Servlet 요청을 해결한다.
스프링의 IoC / DI 컨테이너
- 스프링에서 객체를 생성하고 관리하며 객체 간 의존 관계를 연결해 준다.
- 의존 관계 주입에 포커스를 맞추어 최근에는 DI 컨테이너라고 부르는 경우도 많다.
- 혹은 어샘블러, 오브젝트 팩토리 등으로도 불린다.
BeanFactory
- 스프링 컨테이너의 최상위 인터페이스이다.
- 스프링 빈을 관리하고 조회하는 역할을 담당한다.
- IoC/DI에 대한 기본 기능을 가지고 있다.
ApplicationContext
- BeanFactory 기능을 모두 상속받아 제공한다.
- 보통 스프링 컨테이너라고하면 ApplicationContext를 뜻한다.
- 스프링 컨테이너에서 객체를 스프링 빈으로 등록하고, 빈을 찾아 사용할 수 있다.
- 빈 이름은 중복이 되어서는 안 된다.
- ApplicationContext 또한 인터페이스이다.
- 빈을 관리하고 조회하는 기능 + 수많은 부가 기능을 제공한다.
- 메시지 소스를 활용한 국제화 기능
- 한국에서 접속하면 한국어로, 영어권에서 접속하면 영어로 출력
- 환경변수
- 로컬, 개발, 운영 등을 구분해서 처리
- 애플리케이션 이벤트
- 이벤트를 발행하고 구독하는 모델을 편리하게 지원
- 편리한 리소스 조회
- 파일, 외부 등에서 리소스를 편리하게 조회
- 메시지 소스를 활용한 국제화 기능
정리
- BeanFactory나 ApplicationContext를 스프링 컨테이너라고 한다.
- ApplicationContext는 BeanFactory와 기타 여러 인터페이스의 기능을 상속받는다.
- BeanFactory를 직접 사용하는 일은 거의 없고, 부가 기능이 포함된 ApplicationContext를 사용한다.
빈 조회
AnnotationConfigApplicationContext ac = new
AnnotationConfigApplicationContext(AppConfig.class);
스프링 빈 조회
ac.getBeanDefinitionNames() // 스프링에 등록된 모든 빈 이름을 조회
ac.getBean(빈이름, 타입) // 빈 이름으로 빈 객체를 조회
ac.getBean(타입) // 타입으로 빈 객체를 조회
ac.getBeansOfType() // 해당 타입의 모든 빈을 조회
상속 관계 : 부모 타입으로 조회하면, 자식 타입도 함께 조회된다.
조회하려는 스프링 빈이 없으면 NoSuchBeanDefinitionException 예외 발생
BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);
BeanDefinition.ROLE_APPLICATION // 직접 등록한 애플리케이션 빈
BeanDefinition.ROLE_INFRASTRUCTURE: // 스프링이 내부에서 사용하는 빈
스프링 빈 설정 메타 정보 - BeanDefinition
- 스프링 컨테이너는 자바코드, XML 등 다양한 설정 정보를 읽어낼 수 있도록 유연하게 설계되어 있다.
- 이렇게 다양한 설정 형식을 지원할 수 있는 이유는 BeanDefinition이라는 추상화 덕분이다.
- 스프링 컨테이너는 자바 코드인지, XML인지 모른다. 오직 BeanDefinition만 알면 된다.
- 역할과 구현을 개념적으로 나눈 것이다.
- 자바 코드, XML을 읽어 빈 설정 메타 정보인 BeanDefinition을 생성하고, 이를 기반으로 스프링 빈을 생성한다.
- @Bean : 애너테이션, <bean> : XML 등을 읽고 각각의 메타 정보를 생성한다.
- 가끔 스프링 코드나 스프링 관련 오픈 소스 코드에 BeanDefinition이 보이는데 이때 이 메커니즘을 떠올리자.
참고
김영한 - 스프링 핵심 원리
728x90
'[Spring] > Spring 기본' 카테고리의 다른 글
조회하는 빈이 2 개 이상일 때 해결 방법 (0) | 2023.03.06 |
---|---|
의존관계 주입 (0) | 2023.03.06 |
스프링의 엔트리 포인트 클래스 (0) | 2022.11.16 |
스프링 부트(Spring Boot)란? (0) | 2022.10.12 |
아키텍처(Architecture)와 스프링 프레임워크 모듈(Spring Framework Module) 구성 (0) | 2022.10.12 |