스프링 컨테이너
스프링 컨테이너는 스프링 프레임워크의 핵심 컴포넌트이다.
스프링 컨테이너는 자바 객체의 생명 주기를 관리하며, 생성된 자바 객체들에게 추가적인 기능을 제공한다.
스프링에서는 자바 객체를 빈(Bean)이라 한다.
스프링 컨테이너는 내부에 존재하는 빈의 생명주기를 관리(빈의 생성, 관리, 제거 등)하며, 생성된 빈에게 추가적인 기능을 제공한다.
스프링 컨테이너는 XML, 어노테이션 기반의 자바 설정 클래스로 만들 수 있다.
스프링 부트(Spring Boot)를 사용하기 이전에는 xml을 통해 직접적으로 설정해 주어야 했지만, 스프링 부트가 등장하면서 대부분 사용하지 않게 되었다.
스프링 컨테이너의 종류
BeanFactory
Beans 모듈에서 제공하며 가장 간단한 스프링 컨테이너이다.
객체 설정정보를 읽어서 객체를 생성하고, 객체들 간의 의존성을 조사해서 의존성을 주입한다.
BeanFactory 인터페이스의 구현클래스이다.
@Bean 어노테이션이 붙은 메서드의 이름을 스프링 빈의 이름으로 사용하여 빈 등록을 한다.
ApplicationContext
Context와 web 모듈에서 제공하며 BeanFactory를 확장한 스프링 컨테이너이다. 따라서, 빈을 관리하고 검색하는 기능을 BeanFactory가 제공하고, 그 외의 AOP 기능, 메시지 처리, 이벤트 발행과 같은 부가 기능을 제공한다.
대부분의 스프링 애플리케이션은 ApplicationContext를 사용한다.
스프링 빈의 생명주기
스프링 빈은 스프링 컨테이너 내부에서 생성되고, 스프링이 종료되기 전까지 생명주기(Life-Cycle)를 가지고 있다.
이때, 스프링은 객체 생성 → 의존관계 주입의 라이프 사이클을 가진다.
스프링 빈의 이벤트 라이프 사이클
스프링 내부에서는 스프링의 라이프 사이클과 관련하여 이벤트가 있는데 순서는 다음과 같다.
- 스프링 컨테이너 생성
- 스프링 빈 생성
- 의존관계 주입
- 초기화 콜백(EVENT)
- 앱 본연의 동작 수행
- 소멸 전 콜백(EVENT)
- 스프링 종료
스프링 컨테이너가 가동되고 본격적으로 앱이 동작하기 전에 한번, 스프링이 종료되기 전에 한 번 특정한 동작을 수행할 수 있는 이벤트가 존재한다.
@PostConstruct, @Predestroy
이벤트를 사용하는 방법에는 3가지가 있다.
- 클래스가 InitalizingBean과 DisposalBean을 상속받고 각각 afterPropertiesSet과 destroy 메서드를 구현하는 방식이다. 이때 초기화 콜백시 afterPropertiesSet이, 소멸 전 콜백시 destroy가 호출된다.
- @Bean 어노테이션에 내장된 설정방식으로 각각 initMethod 필드와 destroyMethod필드의 생성과 소멸 시 적용될 메서드명을 정해주면 된다.
- @PostConstruct, @Predestroy
이 중 가장 많이 사용하고 있는 마지막 방법을 알아보자
@PostConstruct
객체의 초기화 부분이다.
객체가 생성된 후 별도의 초기화 작업을 위해 실행하는 메서드를 선언한다.
@PostConstruct 어노테이션을 설정해 놓은 init 메서드는 WAS가 띄워질 때 실행된다.
@PreDestroy
마지막 소멸 단계이다.
스프링 컨테이너에서 빈을 제거하기 전에 해야 할 작업이 있다면 메서드 위에 사용하는 어노테이션
@Component
public class ConnectTest {
@PostConstruct
public void init() {
System.out.println("초기화 콜백");
connect();
}
@PreDestroy
public void close() {
System.out.println("종료 전 콜백");
disconnect();
}
}
단점
외부 라이브러리에 적용하지 못한다.
외부 라이브러리르 초기화, 종료해야 한다면 @Bean에 옵션을 추가하는 기능을 사용해야 한다.
실전
Q. Spring bean container 생성부터 스프링 종료까지의 사이클에 대해 알려주실 수 있을까요?
Spring Container는 스프링의 자바 객체를 뜻하는 빈(bean)의 생명 주기를 관리하며, 생성된 빈에 추가적이 기능을 제공하는 역할을 합니다. 스프링이 실행되면 Spring Container가 생성됩니다. 생성된 Container에 의해 빈 객체를 생성하며 빈 객체에 의존성을 주입합니다. 다음으로 빈 객체는 초기화를 하게 되는데 여러 가지 방법 중에 PostConstruct 어노테이션을 사용해서 초기화를 진행합니다. 그러고 나서 앱 본연의 동작을 수행하게 됩니다. 그 후 빈 객체가 더 이상 필요하지 않거나 Container가 종료될 때 빈 객체를 소멸시킬 경우 PreDestroy 어노테이션을 통해 빈을 제거하기 전에 해야 할 작업을 실행합니다. 그러고 나서 비로소 Spring Container 종료되며 관리하는 모든 빈 객체를 소멸시키고 자원을 정리합니다.
참고
https://ittrue.tistory.com/220
항해 개발자 취업 리부트 코스를 수강하고 작성한 콘텐츠 입니다.
'멋진 개발자 > Java & Spring' 카테고리의 다른 글
개발자 취준 기록 33 - Java 제네릭 (Generic) (0) | 2024.03.27 |
---|---|
[항해 취업코스] 개발자 취준 기록 19 - Filter, Interceptor, AOP (0) | 2024.03.13 |
[항해 취업코스] 개발자 취준 기록 17 - 즉시로딩, 지연로딩 (3) | 2024.03.12 |
[항해 취업코스] 개발자 취준 기록 16 - N + 1 발생 이유와 해결방법 (0) | 2024.03.12 |
[항해 취업코스] 개발자 취준 기록 15 - Spring Security의 구조와 JWT 발급 과정 (0) | 2024.03.12 |