IT/CS 공부

[CS] Graceful Shutdown(우아한 종료)

박소민 2025. 7. 3. 09:30
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초 안에 끝나지 않으면 강제 종료

 

📍 왜 타임아웃이 필요할까?

어떤 요청이 무한루프나 데드락에 빠지면, 계속 기다리기만 하다 영원히 종료가 안 될 수 있음! 
이를 방지하기 위해 타임아웃 설정이 필요