GO · 패턴
그레이스풀 셧다운
서버가 종료 신호를 받으면 진행 중인 요청을 완료하고 안전하게 종료합니다.
패턴고급graceful-shutdownsignalhttp-serverproduction
핵심 설명
서버가 종료 신호를 받으면 진행 중인 요청을 완료하고 안전하게 종료합니다.
Go code
package main
import (
"context"
"fmt"
"net/http"
"os"
"os/signal"
"syscall"
"time"
)
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
time.Sleep(2 * time.Second) // 느린 요청 시뮬레이션
fmt.Fprintln(w, "완료")
})
srv := &http.Server{Addr: ":8080", Handler: mux}
// 종료 신호 수신
quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
go func() {
fmt.Println("서버 시작 :8080")
if err := srv.ListenAndServe(); err != http.ErrServerClosed {
fmt.Printf("서버 에러: %v\n", err)
}
}()
<-quit
fmt.Println("종료 신호 수신...")
// 5초 안에 진행 중인 요청 완료
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
if err := srv.Shutdown(ctx); err != nil {
fmt.Printf("강제 종료: %v\n", err)
}
fmt.Println("서버 안전 종료 완료")
}학습 팁
srv.Shutdown은 새 연결을 거부하면서 기존 연결이 완료될 때까지 대기합니다. 타임아웃을 설정하여 무한 대기를 방지하세요.
주의할 점
os.Exit(0)으로 즉시 종료하면 진행 중인 요청이 끊어지고 DB 트랜잭션이 롤백되지 않을 수 있습니다.
자주 묻는 질문
그레이스풀 셧다운란 무엇인가요?
서버가 종료 신호를 받으면 진행 중인 요청을 완료하고 안전하게 종료합니다.
그레이스풀 셧다운 학습 시 주의할 점은 무엇인가요?
os.Exit(0) 으로 즉시 종료하면 진행 중인 요청이 끊어지고 DB 트랜잭션이 롤백되지 않을 수 있습니다.