Graceful Shutdown(우아한 종료) 이란?
- 서버 애플리케이션이 종료될 때, 처리 중인 작업을 마무리하고 리소스를 정리한 후 안전하게 종료하는 방식
- 갑작스럽게 서버를 종료하는 경우 발생할 수 있는 데이터 손실, 트랜잭션 중단, 사용자 불편 등을 방지
- 일반적으로 SIGTERM 시그널을 받으면, 서버는
- 새로운 요청은 받지 않고
- 현재 처리 중인 요청은 모두 완료한 뒤
- 프로세스를 종료함
Graceful Shutdown이 필요한 이유
- 사용자 요청 도중 서버가 즉시 꺼질 경우, 트랜잭션 실패 또는 데이터 유실 발생 가능
- DB 연결, 파일 핸들 등 리소스가 정리되지 않으면 자원 누수 발생
- 사용자 경험이 저하되며, 시스템 안정성에도 부정적인 영향
- 운영 환경에서 서비스 무중단 배포나 롤링 업데이트에도 필수적인 개념
SIGTERM vs SIGKILL
| 시그널 | 설명 |
| SIGTERM | 프로세스에 종료 요청을 전달. 프로세스가 종료 전에 작업 정리를 할 수 있도록 허용 |
| SIGKILL | 즉시 강제 종료. 프로세스가 시그널을 무시할 수 없으며, 정리 작업 없이 바로 종료 |
→ Graceful Shutdown은 SIGTERM과 같이 프로세스가 종료 시그널을 핸들링할 수 있어야 동작 가능
Spring 환경에서의 Graceful Shutdown
- Spring Boot 2.3 이상부터 기본 지원
- application.properties 또는 application.yml에 아래와 같이 설정
server:
shutdown: graceful
spring:
lifecycle:
timeout-per-shutdown-phase: 20s
- server.shutdown: graceful: 우아한 종료를 활성화
- timeout-per-shutdown-phase: 20s: 종료 단계에서 최대 20초까지 작업을 기다림
- 예: 처리 중인 요청이 20초 안에 끝나지 않으면 강제 종료
📍 왜 타임아웃이 필요할까?
어떤 요청이 무한루프나 데드락에 빠지면, 계속 기다리기만 하다 영원히 종료가 안 될 수 있음!
이를 방지하기 위해 타임아웃 설정이 필요
'IT > CS 공부' 카테고리의 다른 글
| [CS] Java의 final 키워드 (0) | 2025.08.01 |
|---|---|
| [CS] CQRS 패턴 (Command Query Responsibility Segregation) (0) | 2025.06.27 |
| [CS] CI/CD 파이프라인 (1) | 2025.06.26 |
| [CS] 코드 커버리지(Code Coverage) (0) | 2025.06.26 |
| [CS] 의존성 주입(DI : Dependency Injection) (2) | 2025.06.23 |