스프링 컨테이너 Spring Container
= 내부에 존재하는 애플리케이션 빈의 생명주기를 관리
(= Bean 생성, 관리, 제거 등의 역할)
* 스프링 프레임워크의 핵심 컴포넌트!
스프링 컨테이너는 무엇인가?
= ApplicationContext (다형성 적용으로 인터페이스로 구현되어 있다.)
- XML(과거 방식), 애너테이션 기반 자바 설정 클래스로 만들 수 있다.
- 빈의 인스턴스화, 구성, 전체 생명 주기 및 제거 처리
- 개발자가 정의한 Bean을 객체로 만들어 관리, 개발자 필요시 제공
- through 스프링 컨테이너, 원하는 만큼 많은 객체 가질 수 있음
- 의존성 주입을 통해 애플리케이션 컴포넌트 관리
- 애플리케이션의 빈 ~ 빈 연결
- 모듈간 의존, 결합 문제에서 자유로워질 수 있음
- 메서드 호출 위한 매개변수 준비해서 전달 X
스프링 컨테이너를 왜 사용할까?
= 객체 간의 의존성을 낮추기 위해서!
이전에는 객체 사용시 'new 생성자'가 필요했다.
new 생성자로 객체 생성시 애플리케이션 내부 서로 참조 多
➡ 결합도가 높아지게 됨 (↔ 좋은 OOP : 낮은 결합도, 높은 캡슐화 지향)
🔽
스프링 컨테이너 사용시
구현 클래스에 있는 의존 제거, 인터페이스에만 의존하도록 설계 가능
(코드 변경 시 수작업으로 하나하나 수정 안해줘도 됨!)
스프링 컨테이너는 어떻게 생성될까?
: XML(과거 방식), 애너테이션 기반 자바 설정 클래스로 만들 수 있다.
ApplicationContext 인터페이스의 구현체로 스프링 컨테이너를 생성 가능
DependencyConfig.class 등의 구성 정보를 지정해줘서 스프링 컨테이너를 생성
DependencyConfig에 있는 구성 정보를 통해서 스프링 컨테이너는 필요한 객체들을 생성
애플리케이션 클래스는 구성 메타데이터와 결합되어 ApplicationContext 생성 및 초기화된 후
완전히 구성되고 실행 가능한 시스템 또는 애플리케이션을 갖게 됩니다.
* 스프링 빈 조회에서 상속관계가 있을 시 부모타입으로 조회 --> 자식 타입도 함께 조회
object타입으로 조회하면(모든 자바 객체의 최고 부모) --> 모든 스프링 빈을 조회
Configuration Metadata 사용
1. Java Annotation 기반 방법
// Spring Container 생성
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(DependencyConfig.class);
new AnnotationConfigApplicationContext 를 통해 스프링에 있는 @Bean 메서드를 등록
2. XML 기반 방법
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="..." class="...">
<!-- collaborators and configuration for this bean go here -->
</bean>
<bean id="..." class="...">
<!-- collaborators and configuration for this bean go here -->
</bean>
<!-- more bean definitions go here -->
</beans>
스프링 컨테이너의 종류
- Bean Factory
- ApplicationContext
1. Bean Factory
스프링 컨테이너 최상위 인터페이스
빈 관리 : 빈 등록, 생성, 조회 ...
getBean() 메소드로 빈 인스턴스화
@Bean 붙은 메서드 이름을 스프링 빈 이름으로 사용 --> 빈 등록
2. ApplicationContext
BeanFactory 기능 상속 받음
BeanFactory 기능 + 부가기능 (ex. MessageSource, EnvironmentCapable...)
컨테이너 인스턴스화
: 다양한 외부 리소스로부터 구성 메타데이터 로드 가능
// Annotation
ApplicationContext context = new AnnotationConfigApplicationContext(DependencyConfig.class);
// XML
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");
빈이란?(Bean)
= 인스턴스화된 객체
= 스프링 컨테이너에 등록된 객체
= 스프링 컨테이너가 관리하는 객체
@Bean 이 적힌 메서드를 모두 호출 --> 객체를 스프링 컨테이너에 등록
1. 빈 = 클래스 등록 정보, Getter & Setter 메서드 포함
2. 빈 = 설정 메타데이터로 생성됨
(* XML, 자바 애너테이션로 표현됨, 컨테이너 명령, 인스턴스화, 설정 및 조립 객체 정의)
bean 접근 방법
= ApplicationContext 사용하여 bean 정의를 읽고 액세스
ex)
// create and configure beans
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");
// retrieve configured instance
PetStoreService service = context.getBean("memberRepository", memberRepository.class);
* getBean을 통해 bean 인스턴스 가져올 수 있음
(실제적으로 응용프로그램 코드에서는 getBean() 메서드로 호출 X
// use configured instance
List<String> userList = service.getUsernameList();
beanDefinition(빈 설정 메타정보)
bean은 BeanDefinition 에 따라 활용하는 방법이 달라지게 됨
(XML or 애너테이션 방식)
1 @Bean = 1 메타 정보
스프링 컨테이너는 메타 설정정보를 BeanDefinition 인터페이스를 통해 관리한다.
빈 스코프
= 빈이 존재할 수 있는 범위
Bean Definition 생성시에
Bean Definition에 의해 정의된 클래스의 실제 인스턴스를 만들기 위한 '레시피'
특정 bean 정의에서 생성된 개체에 연결할 다양한 의존성, 구성 값
+
특정 bean 정의에서 생성된 개체의 범위
제어 가능
구성을 통해 생성하는 개체 범위 선택
--> 강력하고 유연하다.
*Spring 에는 6개 범위를 지원, 그 중 4개는 Application Context 사용시에만 사용 가능.
Scope | 설명 |
singleton | (Default) 각 Spring 컨테이너에 대한 단일 객체 인스턴스에 대한 단일 bean definition의 범위를 지정 |
prototype | 스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입까지만 관여, 더는 관리하지 않는 매우 짧은 범위의 스코프이다. |
request | 웹 요청이 들어오고 나갈때 까지 유지되는 스코프 |
session | 웹 세션이 생성되고 종료될 때 까지 유지되는 스코프 |
application | 웹의 서블릿 컨텍스와 같은 범위로 유지되는 스코프 |
websocket | 단일 bean definition 범위를 WebSocket의 라이프사이클까지 확장 Spring ApplicationContext의 컨텍스트에서만 유효함 |
빈스코프 中 싱글톤 스코프
= 해당 빈의 인스턴스를 오직 하나만 생성해서 사용하는 것
단일 인스턴스 --> 싱글톤 빈의 캐시에 저장됨
이름이 정해진 빈에 대한 모든 요청, 참조 --> 캐시된 개체 반환
(여러번 호출해도 모두 같은 인스턴스 참조 주소값 有)
'Spring' 카테고리의 다른 글
[Spring] AOP가 필요한 이유, AOP 용어 / Advice, Pointcut, JointPoint (0) | 2022.10.18 |
---|---|
[Spring] Java 기반 컨테이너, Component Scan, 의존 관계 주입 방법 (0) | 2022.10.18 |
[Spring] 아키텍쳐(Architecture)란? / Spring Framework 모듈 구성 보기 (0) | 2022.10.12 |
[Spring] PSA 란? (Portable Service Abstraction) (0) | 2022.10.12 |
[Spring] AOP란? (Aspect Oriented Programming) (0) | 2022.10.12 |
댓글