우아한 종료
OS 신호를 처리하고 연결을 정상적으로 소진합니다.
우아한 종료은(는) CoddyKit의 무료 Go Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Go Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Go Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
정상 종료가 필요한 이유
os.Exit를 호출하거나 단순히 서버를 중지하면 처리 중인 모든 요청이 버려집니다. 정상 종료는 종료하기 전에 활성 요청이 완료될 때까지 기다립니다.
http.Server.Shutdown
srv.Shutdown(ctx)은 새 연결 수락을 중지하고, 활성 요청이 완료될 때까지 기다린 다음 반환합니다. 대기 시간을 제한하려면 데드라인이 있는 컨텍스트를 전달하십시오.
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
srv.Shutdown(ctx)신호 처리
고루틴에서 SIGINT/SIGTERM을 수신 대기하고 신호를 받으면 Shutdown을 호출합니다:
quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
log.Println("shutting down...")
srv.Shutdown(ctx)전체 정상 종료 패턴
고루틴에서 서버를 시작하고, 신호 채널에서 대기한 다음 서버를 종료합니다:
go func() {
if err := srv.ListenAndServe(); err != http.ErrServerClosed {
log.Fatal(err)
}
}()
quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
srv.Shutdown(ctx)http.ErrServerClosed
Shutdown이 호출되면 ListenAndServe는 http.ErrServerClosed를 반환합니다. 이를 오류가 아닌 정상적인 종료로 처리하십시오.
연결 처리 완료 대기
Shutdown은 핸들러 자체가 컨텍스트 취소를 준수하는 경우에만 하이재킹된 모든 연결과 활성 WebSocket 연결이 종료될 때까지 기다립니다. 장시간 폴링이나 스트리밍 핸들러는 r.Context().Done()을 확인해야 합니다.
종료 대기 시간 제한
합리적인 종료 대기 시간 제한(10~30초)을 설정하십시오. 데드라인 이후에도 요청이 실행 중이면 Shutdown은 context.DeadlineExceeded를 반환하고 남은 연결을 강제로 닫습니다.
종료 시 정리
Shutdown이 반환된 후 데이터베이스 풀을 닫고, 로그 버퍼를 비우며, 다른 리소스를 순서대로 해제하십시오. defer 또는 명시적인 순서 제어를 사용하십시오.
srv.Shutdown(ctx)
db.Close()
logger.Sync()Server.Close와 Server.Shutdown 비교
srv.Close()는 기다리지 않고 모든 연결을 즉시 닫습니다. 강제 중지가 허용되는 경우(예: 테스트)만 사용하십시오.
Kubernetes 준비 상태 프로브
종료 중에는 Shutdown을 호출하기 전에 준비 상태 프로브가 503을 반환하도록 변경하십시오. 그러면 로드 밸런서가 해당 파드로 새 요청을 라우팅하지 않게 됩니다.
여러 서버
여러 서버(HTTP + gRPC + 메트릭)를 실행하는 경우 고루틴을 사용해 각 서버를 동시에 종료하고, WaitGroup으로 모든 연결의 처리가 끝날 때까지 기다리십시오.
빠른 확인
http.Server.Shutdown은 무엇을 하나요?
복습: 정상 종료
핵심 내용:
- srv.Shutdown(ctx)는 새 연결을 중지하고 활성 연결이 완료될 때까지 기다림
- signal.Notify로 SIGINT/SIGTERM 수신 대기
- 종료 시 ListenAndServe는 http.ErrServerClosed를 반환하며, 이는 오류가 아님
- 영원히 기다리지 않도록 종료 데드라인 설정
자주 묻는 질문
“우아한 종료” 강의는 무료인가요?
네 — “우아한 종료” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Go Academy 강의 전체를 잠금 해제할 수 있습니다. Go Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“우아한 종료”에서 뭘 배우나요?
OS 신호를 처리하고 연결을 정상적으로 소진합니다. 브라우저에서 직접 실행하는 실습 코드로 Go Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Go Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Go Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“우아한 종료” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Go Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Go Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.