Shutdown Hook이란
기존 종료 작업 방법
자바 애플리케이션을 실행한 후 Ctrl + C 키를 눌러서 종료하는 경우 JVM은 스레드들이 어떤 상황에 있는지에 상관없이 스레드를 강제적으로 종료시키기 때문에 안정적으로 애플리케이션의 종료 작업을 진행할 수 없습니다.
특히, 서버 프로그램의 경우 할당한 자원이나 상태 정보 등을 서버 종료 시에 올바르게 처리해 주어야 하는데, 강제 종료를 통해서는 올바르게 처리할 수 없는 문제가 있습니다.
예를 들어 프로그램이 실행 중에 중요한 데이터를 처리하거나 파일을 열어두고 있는데, 갑자기 종료되면 그 과정이 중단되기 때문에 데이터 손상, 저장되지 않은 정보 등 여러 문제가 발생할 수 있습니다.
이러한 문제를 해결하기 위해서 Shutdown Hook 기능을 사용합니다.
Shutdown Hook 기능
Shutdown Hook는 JVM이 셧다운 될 때 Shutdown 이벤트를 가로채서 특정 코드를 실행할 수 있도록 도와줍니다.
--> 프로그램이 종료될 때 꼭 실행되어야 하는 작업"을 미리 등록하여 실행해 줍니다.
Shutdown hook 발생 상황
- 정상적인 종료 : 프로그램이 자연스럽게 종료되거나, System.exit()가 호출될 때
- 마지막 Non-Daemon 쓰레드 종료 : Daemon 스레드가 아닌 스레드들이 모두 종료되면, JVM도 더 이상 실행할 것이 없어 종료됩니다.
Application exit
Each SpringApplication will register a shutdown hook with the JVM to ensure that the ApplicationContext is closed gracefully on exit.
스프링 애플리케이션은 JVM과 함께 셧다운 훅을 등록합니다. ApplicationContext가 안정적으로 종료되는 것을 보장하기 위해서
beans may implement the ExitCodeGenerator interface if they wish to return a specific exit code when SpringApplication.exit() is called
This exit code can then be passed to System.exit() to return it as a status code.
SpringApplication.exit() 호출을 통해 특정 종료 코드를 리턴한다.
이 종료 코드는 System.exit()에 전달되어 상태 코드를 반환한다.
참고자료
'JAVA' 카테고리의 다른 글
Java Record 컴팩트 생성자(compactconstructor) 이해하기 - record, @QueryProjection 적용 (0) | 2024.11.18 |
---|---|
Java if문 최적화와 가독성 향상 방법 - 클린코드 작성 방법 (0) | 2024.11.12 |
[Java] 자바 predicate, consumer, supplier, function 이해하기 - 함수형 인터페이스 이해하기 (3) | 2024.09.22 |
[Java] 자바 추상화 설계 이해하기 - 추상 클래스와 인터페이스 활용 (0) | 2024.09.21 |
[Java] Java of, from, parse 정적 팩토리 메서드 이해하기 - Method Naming Convention (0) | 2024.09.19 |