Gracefulshutdown


title: 2026-03-08 author: 강병호 (이름) date: 2026-03-08 (날짜) category: TIL/강병호/2026/03 (파일 경로 : TIL/{이름}/{연}/{월}) layout: post (자유) —

우아한 종료(Graceful Shutdown)

우아한 종료(Graceful Shutdown)란 애플리케이션 종료 시 수행 중인 작업을 즉시 중단하지 않고, 현재 처리 중인 요청을 모두 마무리한 뒤 리소스를 정리하고 종료하는 방식을 의미합니다.

서버 애플리케이션에서 Graceful Shutdown이 제대로 이루어지지 않고 즉각적으로 프로세스가 종료될 경우 다음과 같은 문제가 발생할 수 있습니다.

  • 트랜잭션 비정상 종료: 데이터베이스 작업 중 연결이 끊겨 데이터 정합성이 깨질 수 있습니다.
  • 데이터 손실: 메모리에 머물러 있던 데이터가 디스크에 기록되지 못하고 사라질 수 있습니다.
  • 사용자 경험 저하: 요청을 보낸 사용자는 갑작스러운 연결 끊김(Connection Reset) 응답을 받게 됩니다.

종료 시그널의 이해: SIGTERM vs SIGKILL

운영체제가 프로세스에 종료 명령을 보낼 때 주로 사용하는 두 가지 시그널의 차이점은 다음과 같습니다.

1. SIGTERM (Signal Terminate)

  • 특징: 프로세스에 종료를 ‘요청’하는 표준 시그널입니다.
  • 처리 방식: 프로세스가 이 시그널을 감지(Handling)할 수 있습니다. 따라서 프로그램은 종료 전 필요한 정리 작업(리소스 해제, 로그 기록 등)을 수행할 시간을 가집니다.
  • 용도: Graceful Shutdown을 구현할 때 사용되는 핵심 시그널입니다.

2. SIGKILL (Signal Kill)

  • 특징: 운영체제가 프로세스를 즉시 강제 종료합니다.
  • 처리 방식: 프로세스는 이 시그널을 무시하거나 별도의 핸들러를 통해 처리할 수 없습니다. 어떠한 정리 절차 없이 즉각 프로세스가 소멸합니다.
  • 용도: 프로세스가 응답하지 않거나 제어 불능 상태일 때 최후의 수단으로 사용합니다.

Spring Boot 환경에서의 Graceful Shutdown 설정

Spring Boot 2.3 버전부터는 설정을 통해 간편하게 Graceful Shutdown을 활성화할 수 있습니다.

주요 설정 값

# Graceful Shutdown 활성화 (기본값은 immediate)
server.shutdown=graceful

# 최대 대기 시간 설정 (timeout)
spring.lifecycle.timeout-per-shutdown-phase=20s

작동 원리 및 유의사항

  1. 신규 요청 차단: SIGTERM 시그널을 받으면 서버는 더 이상 새로운 네트워크 요청을 받지 않습니다.
  2. 기존 요청 처리: 이미 접수되어 처리 중인 요청들은 설정된 타임아웃 시간 동안 완료될 때까지 기다립니다.
  3. 타임아웃 적용: 만약 처리 중인 작업이 데드락(Deadlock)이나 무한 루프에 빠져 종료되지 않을 경우를 대비하여 타임아웃을 설정합니다. 위 설정 기준, 20초가 지나도 작업이 끝나지 않으면 프로세스는 강제로 종료됩니다.

results matching ""

    No results matching ""