GO · 에러처리
에러 미들웨어
HTTP 핸들러의 에러를 통합 처리하는 미들웨어. 에러 타입에 따라 적절한 HTTP 응답을 반환합니다.
에러처리고급error-middlewarehttphandlerstructured
핵심 설명
HTTP 핸들러의 에러를 통합 처리하는 미들웨어. 에러 타입에 따라 적절한 HTTP 응답을 반환합니다.
Go code
package main
import (
"errors"
"fmt"
"log/slog"
)
type HTTPError struct {
Code int
Message string
Err error
}
func (e *HTTPError) Error() string { return e.Message }
func (e *HTTPError) Unwrap() error { return e.Err }
var (
ErrNotFound = &HTTPError{Code: 404, Message: "리소스 없음"}
ErrBadReq = &HTTPError{Code: 400, Message: "잘못된 요청"}
)
// 에러를 반환하는 핸들러 타입
type AppHandler func(req string) (string, error)
// 에러 미들웨어
func errorMiddleware(h AppHandler) func(string) string {
return func(req string) string {
result, err := h(req)
if err != nil {
var httpErr *HTTPError
if errors.As(err, &httpErr) {
slog.Error("HTTP 에러", "code", httpErr.Code, "msg", httpErr.Message)
return fmt.Sprintf("%d: %s", httpErr.Code, httpErr.Message)
}
slog.Error("내부 에러", "error", err)
return "500: 내부 서버 오류"
}
return result
}
}
func main() {
handler := func(req string) (string, error) {
if req == "" { return "", fmt.Errorf("빈 요청: %w", ErrBadReq) }
return "OK: " + req, nil
}
wrapped := errorMiddleware(handler)
fmt.Println(wrapped("hello"))
fmt.Println(wrapped(""))
}학습 팁
에러 미들웨어에서 센티널 에러와 커스텀 에러 타입을 분류하면 일관된 HTTP 응답과 로깅을 보장할 수 있습니다.
주의할 점
에러 미들웨어에서 내부 에러 메시지를 그대로 클라이언트에 노출하면 보안 취약점이 됩니다. 일반적인 메시지로 변환하세요.
자주 묻는 질문
에러 미들웨어란 무엇인가요?
HTTP 핸들러의 에러를 통합 처리하는 미들웨어. 에러 타입에 따라 적절한 HTTP 응답을 반환합니다.
에러 미들웨어 학습 시 주의할 점은 무엇인가요?
에러 미들웨어에서 내부 에러 메시지를 그대로 클라이언트에 노출하면 보안 취약점이 됩니다. 일반적인 메시지로 변환하세요.
Continue Learning
Go 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.