Spring/Dependency Injection

[Spring] @PreDestroy 사용해 Bean이 파괴되기 직전에 할 작업 설정하기

Dev.Cho 2024. 11. 24. 07:48
반응형

@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는 다음 페이지에서 확인할 수 있습니다.
반응형