Spring Bean LifeCycle
Spring DI 컨테이너는 Bean으로 등록된 객체의 생명주기 관리를 위임받아서 관리하고, 객체가 필요한 곳에서 이 Bean을 의존성 주입받아서 사용할 수 있다.
스프링 컨테이너가 생성될 때 객체(Bean)를 생성하고 의존성을 주입하는데, 의존관계 주입 후 Bean을 초기화하고, 스프링 컨테이너를 종료하기 전에 객체를 소멸시켜야 한다.
객체의 생성과 초기화 분리
객체를 초기화 한다는 것은, 객체 생성 이외에 외부 커넥션을 연결하거나, 초기값을 등록하는 등의 여러 작업을 말한다.
이 과정을 생성자에서 진행해도 되지만, 객체 생성에 비해 초기화는 비교적 무거운 일을 수행하기 때문에 객체를 생성하는 부분과 초기화하는 부분을 명확하게 나누는 것이 좋다.
빈 생명주기
스프링 빈은 아래와 같은 생명주기(Life Cycle)를 가진다.
스프링 컨테이너 생성 -> Bean 생성 -> 의존성 주입 -> 초기화 콜백 -> Bean 사용 -> 소멸 전 콜백 -> 스프링 종료
- 초기화 콜백(init) : Bean이 생성되고, Bean의 의존성 주입이 완료된 뒤 호출된다.
- 소멸 전 콜백(destroy) : 스프링이 종료되기 전, Bean이 소멸되기 직전에 호출된다.
빈 생명주기 콜백 설정 방법
@PostConstruct / @PreDestroy
스프링에서 권장하는 방법으로, 어노테이션을 초기화, 소멸 전 콜백 메서드에 붙여주면 된다.
Spring에 종속적인 기술도 아니고, Java 표준 기술이다.
@Component를 이용하여 Bean을 등록 하는 경우에는 하나의 클래스에서 확인할 수 있다는 장점도 있다.
public class TestBean {
//...
@PostConstruct
public void init() {
System.out.println("빈 초기화");
start();
}
@PreDestroy
public void close() {
System.out.println("빈 소멸 직전");
finish();
}
}
이 방법은 내부 코드를 수정할 수 없는 경우에는 사용하지 못한다.
외부 라이브러리에 대한 초기화, 종료 설정을 하려면 아래와 같은 @Bean 설정을 이용하자.
@Bean(initMethod = "...", destroyMethod = "...")
이 방법을 이용하면, @Bean 어노테이션에 추가 설정으로 메서드 명을 명시하는 방식으로 초기화, 소멸 전 콜백 메서드를 등록할 수 있다.
클래스 내부 코드가 아닌, 설정하는 곳(Configuration)에서 지정하기 때문에 내부 코드를 고칠 수 없는 경우에 유용하다.
@Configuration
class TestLifeCycleConfig {
@Bean(initMethod = "init", destroyMethod = "close") //메서드 이름
public TestBean testBean() {
return new TestBean();
}
}
InitializingBean, DisposableBean 인터페이스
이 방법은 스프링 라이브러리에 직접 의존하고, 과거에 사용되던 기술이다.
이런 게 있다 정도만 알아둬도 될 것 같다.
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
public class TestBean implements InitializingBean, DisposableBean {
// ...
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("빈 초기화");
start();
}
@Override
public void destroy() throws Exception {
System.out.println("빈 소멸 직전");
finish();
}
}
'JAVA & Spring > Spring' 카테고리의 다른 글
[DB / Spring ] @Transactional 세부 설정 - 격리 수준 / 전파 수준 설정 (0) | 2024.03.19 |
---|---|
[Spring] 빈 스코프 (Bean Scope) / 싱글톤, 프로토타입 등 (0) | 2024.02.27 |
[Spring] 의존성 주입 방법 (DI : Dependency Injection), 생성자 주입 / 필드 주입 / setter 주입, 생성자 주입을 사용하는 이유 (0) | 2024.02.22 |
[Spring Boot] @RequestMapping 매핑 (0) | 2023.10.02 |
[Spring] application.properties와 application.yml의차이 (0) | 2023.08.18 |