@PreDestroy란 무엇이며 언제 사용될까?
@PreDestroy 어노테이션을 함수에 적용하면 해당 Bean이 소멸되기 직전에 메서드가 자동으로 호출되며, 주로 다음과 같은 작업에 사용된다.
1. 리소스 해제: 열려있는 파일이나 네트워크 연결 닫기
2. 캐시 정리: 메모리에 저장된 임시 데이터 삭제
3. 백그라운드 작업 종료: 실행 중인 스레드나 작업 중지
@PreDestroy 사용해보기
@PreDestroy를 사용하는 방법은 간단하다. 단순히 Bean이 파괴되기 전 실행할 함수 위에 @PreDestroy를 붙인 후 내부에 실행할 코드를 작성하면 된다.
예를 들어 이전 글에서 다룬 SearchInMemoryCache에서 Bean이 파괴되기 전체 캐시를 지워야 한다고 해보자. 그런 경우 다음과 같이 cleanUp 함수를 만든 후 @PreDestroy 어노테이션을 위에 붙이면 된다.
@Component
class SearchInMemoryCache() {
private val searchResults: MutableList<String> = mutableListOf()
@PostConstruct
fun setUp() {
searchResults.addAll(
listOf("Search Result 1", "Search Result 2")
)
println("Search results are loaded")
}
@PreDestroy
fun cleanUp() {
searchResults.clear()
println("Search results are cleared")
}
}
이제 이 cleanUp 함수가 제대로 수행되는지 확인해보기 위해 컨테이너를 초기화 하고 곧바로 닫아 보자. 이를 위해 다음과 같이 코드를 작성한다. context.close() 함수는 컨테이너를 닫아 내부의 Bean을 모두 파괴한다.
@ComponentScan
@Configuration
class SearchConfiguration
fun main(args: Array<String>) {
val context = AnnotationConfigApplicationContext(SearchConfiguration::class.java)
context.close()
}
그러면 다음과 같이 "Search results are cleared" 가 출력되는 것을 볼 수 있다.
전체 코드: GitHub
이 프로젝트가 도움이 되셨다면 저장소에 Star⭐️를 눌러주세요! Stargazers는 다음 페이지에서 확인할 수 있습니다.
반응형