PHpullh
학습 라이브러리/Go/그레이스풀 셧다운

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 트랜잭션이 롤백되지 않을 수 있습니다.

Continue Learning

Go 학습을 이어가세요

총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.