카테고리 없음
[Spring] 빈의 생명주기와 콜백
개바리여리
2025. 6. 28. 13:02
스프링 컨테이너는 빈 객체들을 관리하는 역할을 한다.
이러한 관리에는 객체의 생성~ 소멸 까지의 LifeCycle 관리를 하고 필요에 따라 호출해주는 역할이다.
빈의 생명주기 전체 흐름
- 빈 생성
- 스프링 컨테이너가 빈을 생성 (new 키워드)
- 의존성 주입 (DI)
- 생성자, 세터, 필드 등을 통해 필요한 의존 객체를 주입
- 빈 이름 설정 (Optional)
- BeanNameAware 인터페이스를 구현하면, setBeanName() 호출됨
- 빈 팩토리 설정 (Optional)
- BeanFactoryAware, ApplicationContextAware 등을 구현 시 관련 설정 주입
- 초기화 콜백
- InitializingBean의 afterPropertiesSet() 호출
- 또는 @PostConstruct 메서드 실행
- 또는 init-method에 지정된 메서드 호출
- 빈 사용 가능 상태
- 소멸 콜백
- @PreDestroy 메서드 실행
- 또는 DisposableBean의 destroy() 호출
- 또는 destroy-method에 지정된 메서드 호출
- GC 대상이 됨
여기서 말하는 "콜백(callback)" 은 "스프링이 특정 시점에 사용자가 지정한 메서드를 대신 호출해주는 것" 을 말한다.
빈 생명주기 콜백 - 인터페이스 기반 콜백
| 목적 | 인터페이스 | 메서드 |
| 초기화 | InitializingBean | afterPropertiesSet() |
| 소멸 | DisposableBean | destroy() |
public class MyBean implements InitializingBean, DisposableBean {
@Override
public void afterPropertiesSet() {
System.out.println("빈 초기화 완료");
}
@Override
public void destroy() {
System.out.println("빈 소멸 전 처리");
}
}
InitializingBean은 afterPropertiesSet 메서드를 통해 의존성 주입이 끝난 후에 초기화를 진행할 수 있다.
DisposableBean은 destory() 메서드로 Bean 종료 전에 소멸을 지원한다. (자원 해제)
이러한 방식은 POJO 방식은 아니며 스프링 인터페이스에 의존하게 되는 단점이 존재한다. (특정 인터페이스에 종속적)
이 방식은 초창기 스프링 방식이며 현재는 잘 사용하지 않는다.
빈 생명주기 콜백 - 어노테이션 기반 콜백
애노테이션 시점
| 어노테이션 | 시점 |
| @PostConstruct | 초기화 직후 |
| @PreDestroy | 소멸 직전 |
@Component
public class MyBean {
@PostConstruct
public void init() {
System.out.println("초기화 메서드 호출");
}
@PreDestroy
public void cleanup() {
System.out.println("소멸 전 메서드 호출");
}
}
스프링에 종속되지 않는 자바 표준 어노테이션을 활용한 방법이다.
매우 편리한 방식이며 스프링에서 지향하는 방식이다.