1. Spring Bean이란 ?
- Spring Bean은 Spring IoC 컨테이너가 관리하는 자바 객체로서 컨테이너에 의해 생명주기가 관리되는 객체를 의미한다.
- IoC 컨테이너 안에 들어있는 객체로 필요할 때마다 IoC 컨테이너에서 가져와서 사용한다.
- 어노테이션인 @Bean을 사용하거나 xml 설정을 통해 일반 객체를 Bean으로 등록이 가능하다.
- 즉, Spring 에서는 Bean은 ApplicationContext가 알고 있는 객체이며 ApplicationContext가 생성하고 직접 관리해주는 객체를 의미한다.
XML 기반의 Bean 정의 방법들
<!-- 간단한 빈 정의 -->
<bean id="..." class="..."></bean>
<!-- scope와 함께 빈 정의 -->
<bean id="..." class="..." scope="singleton"></bean>
<!-- property와 함께 빈 정의 -->
<bean id="..." class="...">
<property name="beaninit" value="Hello World!"/>
</bean>
<!-- 초기와 메소드와 함께 빈 정의 -->
<bean id="..." class="..." init-method="..."></bean>
2. Spring Bean의 생명 주기
- 객체 생성 -> 의존 설정 -> 초기화 -> 사용 -> 소멸 과정의 생명 주기를 가지고 있다.
- Bean은 스프링 컨테이너에 의해 생명주기를 관리한다.
- 스프링 컨테이너가 초기화될 때 먼저 빈 객체를 설정에 맞춰 생성하며 의존 관계를 설정한 뒤 해당 프로세스가 완료되면 빈 객체가 지정한 메소드를 호출해서 초기화를 진행한다.
- 객체를 사용해 컨테이너가 종료될 때 빈이 지정한 메서드를 호출해 소멸 단계를 거친다.
- 스프링은 InitializingBean 인터페이스와 DisposableBean을 제공하며 빈 객체의 클래스가 InitializingBean Interface 또는 DisposableBean을 구현하고 있으며 해당 인터페이스에서 정의된 메소드를 호출해 빈 객체의 초기화 또는 종료를 수행한다.
- 또한 어노테이션을 이용한 빈 초기화 방법에는 @PostConstruct와 빈 소멸에서는 @PreDestory를 사용한다.
// 생성 관련한 인터페이스
public interface InitializingBean {
void afterPropertiesSet() throws Exception;
}
// 소멸 관련한 인터페이스
public interface DispoasableBean {
void destroy() throws Exception;
}
public class Test implements InitializingBean, DisposableBean {
@Override
public void afterPropertiesSet() throws Exception {
//빈 생성후 메소드 호출
System.out.println("afterPropertiesSet() 실행");
}
@Override
public void destroy() throws Exception {
// 소멸을 진행하는 메소드
System.out.println("destroy() 실행");
}
}
3. Spring Bean의 Scope
- Bean Scope는 기본적으로 빈이 존재하는 범위를 뜻한다.
- Bean의 객체는 기본적으로 singleton의 범위를 가지며 singleton는 스프링 컨테이너의 시작과 종료까지 단 하나의 객체만을 사용하는 방식이다.
- request, session, global session의 scope는 일반 spring 어플리케이션이 아니라 Spring MVC Web Application에서만 사용된다.
Scope | 설명 |
singleton | 하나의 Bean 정의에 대해 Spring IoC Container에서 단 하나의 객체만 존재한다. |
prototype | 하나의 Bean 정의에 대해 다수의 객체가 존재할 수 있다. |
request | 하나의 Bean 정의에 대해 하나의 HTTP request의 생명주기 안에 단 하나의 객체만 존재한다. 각각의 HTTP request는 자신만의 객체를 가지며 Web-aware Spring ApplicationContext 안에서만 유효한 특징이 있다. |
session | 하나의 Bean 정의에 대해 하나의 HTTP Session의 생명주기 안에서 단 하나의 객체만 존재한다. Web-aware Spring ApplicationContext 안에서만 유효한 특징이 있다. |
global session | 하나의 Bean 정의에 대해 하나의 global HTTP Session의 생명주기 안에서 단 하나의 객체만 존재한다. 일반적으로는 portlet context안에서만 유효하며, Web-aware Spring ApplicationContext 안에서만 유효한 특징이 있다. |
- Bean의 객체 범위를 prototype으로 설정하면 객체를 매번 새롭게 생성한다는 특징이 있으며, prototype으로 설정하면 @Scope 어노테이션을 @Bean 어노테이션과 함께 사용해야 한다.
1) Singleton
- singleton bean은 Spring 컨테이너 안에서 딱 한 번 생성되며, 컨테이너가 사라질 때는 bean고 같이 사라진다.
- 생성된 하나의 인스턴스는 single bean cache에 저장되며 해당 bean에 대한 요청과 참조가 있을 때마다 캐시된 객체를 반환한다.
- 기본적으로 모든 bean은 scope이 명시적이지 않으면 singleton scope을 가진다.
// xml 설정
<bean id="..." class="..." scope="singleton"></bean>
// annotaion 설정 (대상 클래스에 적용)
@Scope("singleton")
2) Prototype
- prototype bean은 모든 요청에서 새로운 객체로 생성하는 것이며, 의존성 관계의 bean이 주입될 때마다 새로운 객체가 생성되어 주입된다.
- GC에 의해 bean이 자동으로 제거된다.
// xml 설정
<bean id="..." class="..." scope="prototype"></bean>
// annotaion 설정 (대상 클래스에 적용)
@Scope("prototype")
'프로그래밍공부 > Spring' 카테고리의 다른 글
스프링 컨테이너 (0) | 2022.06.15 |
---|---|
IoC, DI 그리고 Container (0) | 2022.06.15 |
스프링이란 - 2 (0) | 2022.04.11 |
스프링이란 - 1 (0) | 2022.04.10 |