Backend
Enterprise Go 시리즈 #2: 견고한 HTTP 서버 구축
운영 가능한 Go HTTP 서버를 위한 미들웨어 순서, 에러 매핑, 종료 전략을 정리합니다.
Enterprise Go Series(2 / 9)
Enterprise Go 시리즈 #2: 견고한 HTTP 서버 구축
목표
서버는 "응답만 되는 코드"가 아니라, 장애 시에도 예측 가능한 동작을 해야 합니다. 핵심은 세 가지입니다.
- 미들웨어 순서
- 에러 계약
- graceful shutdown
1) 미들웨어 순서
권장 순서:
RecoverRequestIDLoggerCORSAuthHandler
이 순서가 깨지면 추적 불가 로그, 패닉 누락, 인증 실패 누락 로그가 생깁니다.
2) 도메인 에러 -> HTTP 매핑
핸들러에서 원천 에러를 직접 분기하지 말고 도메인 코드로 매핑합니다.
switch err.Code {
case domain.CodeNotFound:
status = 404
case domain.CodeValidation:
status = 400
default:
status = 500
}
규칙이 있으면 에러 포맷과 모니터링 지표가 안정됩니다.
3) Graceful Shutdown
종료 시 해야 할 일:
- 새 요청 수락 중지
- 진행 중 요청에 제한 시간 부여
- 커넥션/워커 정리 후 종료
ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM)
defer stop()
멀티 컴포넌트 구성이라면 run.Group 패턴으로 종료 순서를 한곳에서 관리하는 편이 안전합니다.
운영 체크포인트
- readiness/liveness 분리
- request timeout 기본값 명시
- panic 발생 시 표준 에러 응답 보장
- access log에 request id 필수
요약
견고한 서버의 핵심은 프레임워크가 아니라 운영 규칙입니다. 미들웨어 순서, 에러 매핑, 종료 절차를 팀 표준으로 고정하면 장애 대응이 빨라집니다.