PHpullh
학습 라이브러리/Go/에러 미들웨어

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 응답을 반환합니다.

에러 미들웨어 학습 시 주의할 점은 무엇인가요?

에러 미들웨어에서 내부 에러 메시지를 그대로 클라이언트에 노출하면 보안 취약점이 됩니다. 일반적인 메시지로 변환하세요.