@PreDestory는 Spring Bean 이 소멸되기 직전에 실행되어야 할 메서드에 붙이는 어노테이션이다.
즉, 빈이 종료될 때 정리(clean0up) 작업을 수행하기 위해 사용한다. (Spring은 이 표준 어노테이션을 인식하여 Bean 생명주기 관리에 통합함.)
Spring Bean의 라이플 사이클 종료 시점에 실행(컨테이너 종료, 해당 Bean이 scope에 따라 더이상 필요 없어진 경우)
<aside> 💡
Spring 종료 시점 = ApplicationContext 종료 시점
Spring은 모든 Bean을 관리하는 컨테이너(ApplicationContext)를 중심으로 동작하낟. 따라서, 컨테이너가 종료되는 시점에 그 안에 존재하는 Bean 또한 파괴된다.
Spring 종료 = Spring Container 종료 = 모든 Bean 파괴
Bean 파괴 시점
Bean Scope | 생성 시점 | 파괴 시점 | @PreDestroy 실행 여부 |
---|---|---|---|
singleton | 컨텍스트 시작 시 | 컨텍스트 종료 시 | ✅ 자동 실행 |
prototype | 요청 시 | 수동 관리 필요 | ❌ 자동 실행 안 됨 |
request | HTTP 요청 시작 시 | 요청 종료 시 | ✅ 실행 |
session | 세션 생성 시 | 세션 만료 시 | ✅ 실행 |
application | 컨텍스트 초기화 시 | 서블릿 종료 시 | ✅ 실행 |
대부분의 Bean은 Singleton으로 애플리케이션 종료 시점에 파괴
SpringApplication.run()
으로 시작된 Spring Boot가 종료될 때)Prototype Bean 파괴 시점
Spring이 “생성”까지만 관리하고, “소멸”은 개발자가 직접 처리해야 한다.
Request / Session / Application Scope (웹 환경[Spring MVC, WebFlux])
스코프 | 파괴 시점 | 예시 |
---|---|---|
request |
요청(Request)이 끝날 때 | 컨트롤러 빈 |
session |
세션이 만료될 때 | 세션 기반 사용자 정보 빈 |
application |
ServletContext 종료 시 | 전역 공용 빈 |
Spring Boot 기준 실제 종료 시점 예시
Spring Boot는 내장 톰캣(WAS) 이 종료될 때 다음 순서로 동작합니다:
SpringApplication.exit()
실행ApplicationContext.close()
호출@PreDestroy
메서드 실행import jakarta.annotation.PreDestroy;
import org.springframework.stereotype.Service;
@Service
public class ConnectionService {
private final DatabaseConnection connection = new DatabaseConnection();
public void connect() {
connection.open();
System.out.println("📡 DB 연결 완료");
}
@PreDestroy
public void closeConnection() {
connection.close();
System.out.println("🔌 DB 연결 종료");
}
}
ConnectionService
를 Bean으로 등록connect()
등 비즈니스 로직 수행@PreDestroy
가 붙은 closeConnection()
자동 실행