컨테이너
: 내부에 또 다른 컴포넌트를 가지고 있는 어떤 컴포넌트를 의미
: 객체를 생성하고 객체를 서로 연결함
: 객체를 설정하는 단계를 지나 마지막으로 생명주기 전반(생성~관리~소멸)을 관리함
: 객체의 의존성을 확인해 생성한 뒤 적절한 객체에 의존성을 주입함
: 스프링은 스프링 컨테이너를 통해 객체를 관리
: 스프링 컨테이너에서 관리되는 객체를 빈이라고 함
@Configuration : 구성정보를 담당하는 것을 설정할때 붙여줌
@Bean: 각 메서드에 붙여 스프링 컨테이너에 자동으로 등록
스프링 컨테이너(Spring Container)
: 스프링 프레임워크의 핵심 컴포넌트로 내부에 존재하는 애플리케이션 빈의 생명주기를 관리(Bean 생성, 관리, 제거 등의 역할을 담당)
What(스프링 컨테이너란?)
: ApplicationContext 를 말하며 인터페이스로 구현되어 있음 (다형성 적용)
: @Configuration이 붙은 클래스를 설정 정보로 사용함
@Bean이 적힌 메서드를 모두 호출하여 반환된 객체를 스프링 컨테이너에 등록하며, 등록된 객체를 스프링 빈이라고 함
(스프링 빈은 applicationContext.getBean() 메서드를 활용해 찾기 가능)
: 스프링 애플리케이션의 런타임 환경을 나타내는 스프링 컨텍스트를 생성하고 관리
- XML, 애너테이션 기반의 자바 설정 클래스로 만들 수 있음
- 빈의 인스턴스화, 구성, 전체 생명 주기 및 제거까지 관리(Bean을 객체로 만들어 관리하고 개발자가 필요할 때 제공)
- 스프링 컨테이너를 통해 원하는 만큼 많은 객체를 가질 수 있음
- 의존성 주입을 통해 애플리케이션의 컴포넌트를 관리함
- 서로 다른 빈을 연결해 애플리케이션의 빈을 연결하는 역할을 함
- 모듈 간에 의존 및 결합으로 인해 발생하는 문제에서 자유로울 수 있음
- 메서드가 언제, 어디서 호출되어야 하는지, 메서드 호출을 위해 필요한 매개 변수를 준비해 전달하지 않음
Why(스프링 컨테이너 사용 이유)
: 객체 사용을 위해 사용하는 new 생성자로 인해 의존성이 높아져 높은 결합성을 보이기 때문
: 낮은 결합도와 높은 캡슐화를 위해 객체간 의존성을 낮추기 위해 Spring 컨테이너를 사용
>> 구현 클래스에 있는 의존을 제거하고 인터페이스에만 의존하도록 설계할 수 있기 때문
How(생성 과정)
1) 비어있는 스프링 컨테이너 생성(스프링 컨텍스트 초기화)
2) 스프링 설정 파일들을 기반으로 하여 빈을 등록
>> Configuration Metadata를 사용하며, 파라미터로 넘어온 설정 클래스 정보를 사용해 스프링 빈을 등록
(new AnnotationConfigApplicationContext(구성정보.class)로 스프링에 있는 @Bean의 메서드 등록)
* 스프링 빈 조회에서 상속관계가 있을 경우 부모타입으로 조회하면, 자식 타입도 함께 조회되기 때문에 모든 자바 객체의 최고 부모인 object 타입으로 조회하면 모든 스프링 빈 조회가 가능함
3) 스프링 설정 파일들을 기반으로 하여 스프링 빈 의존관계를 주입
Spring Container 종류
1) BeanFactory
: 스프링 컨테이너의 최상위 인터페이스
: 빈을 등록/생성/조회/돌려주는 등의 관리 역할을 담당함
: getBean() 메서드를 통해 빈 인스턴스화가 가능함
: @Bean이 붙은 메서드 명을 스프링 빈의 이름으로 사용해 빈 등록을 함
2) AppicationContext
: BeanFactory의 기능을 상속받아 제공
: 스프링 컨테이너이자 컨텍스트 역할을 수행
: 빈을 관리하고 검색하는 기능을 BeanFactory가 제공하고 그 외 부가기능을 제공
* 부가기능
- MessageSource : 메세지소스를 활용한 국제화 기능 (한국어,영어 등)
- EnvironmentCapable : 환경변수 (로컬,개발,운영등을 구분해서 처리)
- ApplicationEventPublisher : 이벤트를 발행하고 구독하는 모델을 편리하게 지원
- ResourceLoader : 파일, 클래스패스, 외부 등 리소스를 편리하게 조회
스프링 컨테이너에서 스프링 컨텍스트라는 것을 생성하고 관리한다고 했는데, 그렇다면 스프링 컨텍스트는 무엇인가?
스프링 컨텍스트란?
: 애플리케이션의 런타임 환경을 나타냄
즉, 스프링 애플리케이션 설정 정보 포함 / 빈의 라이프사이클 관리 / 빈의 의존성 주입 처리
: 빈의 생성, 설정, 관리, 검색 및 런타임 시 빈 간의 협력을 관리
: ApplicationContext의 인터페이스를 구현한 클래스들을 나타내어 스프링 빈을 관리하고 애플리케이션을 구성
스프링 컨테이너와 스프링 컨텍스트가 많이 햇갈리는데,
스프링 컨테이너는 스프링 빈의 생성 및 관리를 담당하는 일종의 스프링 컨텍스트라고 생각하면 됨
즉, 스프링 컨테이너는 스프링 컨텍스트를 생성하고, 스프링 컨텍스트는 애플리케이션 빈을 관리한다고 보면 됨
* 빈에 대한 설명
https://kcode-recording.tistory.com/50
[Spring Core] 빈(Bean)
빈(Bean) : 스프링 컨테이너(Spring Container)에 의해 관리되는 재사용 소프트웨어 컴포넌트(자바 객체) : 인스턴스화된 객체를 의미 : 스프링 컨테이너에 등록된 객체를 스프링 빈(Spring Bean)이라 하며,
kcode-recording.tistory.com
'공부 자료 > Spring' 카테고리의 다른 글
[Spring Core] 빈 스코프(Bean Scope) (0) | 2022.10.13 |
---|---|
[Spring Core] 빈(Bean) (1) | 2022.10.13 |
[Spring Core] Spring Boot (0) | 2022.10.12 |
[Spring Core] 아키텍처로 보는 Spring Framework Module 구성 (0) | 2022.10.12 |
[Spring Core] AOP (Aspect Oriented Programming) (0) | 2022.10.11 |