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

GO · 함수

미들웨어 패턴

함수를 감싸는 미들웨어 패턴으로 로깅, 인증, 복구 등 횡단 관심사를 분리합니다.

함수고급middlewarechaindecoratorhandler

핵심 설명

함수를 감싸는 미들웨어 패턴으로 로깅, 인증, 복구 등 횡단 관심사를 분리합니다.

Go code

package main

import (
	"fmt"
	"time"
)

type Handler func(req string) string
type Middleware func(Handler) Handler

func logging(next Handler) Handler {
	return func(req string) string {
		start := time.Now()
		result := next(req)
		fmt.Printf("[LOG] %s → %v\n", req, time.Since(start))
		return result
	}
}

func recover_(next Handler) Handler {
	return func(req string) (result string) {
		defer func() {
			if r := recover(); r != nil {
				result = fmt.Sprintf("ERROR: %v", r)
			}
		}()
		return next(req)
	}
}

func chain(h Handler, mws ...Middleware) Handler {
	for i := len(mws) - 1; i >= 0; i-- {
		h = mws[i](h)
	}
	return h
}

func main() {
	handler := func(req string) string { return "OK: " + req }
	wrapped := chain(handler, logging, recover_)
	fmt.Println(wrapped("/api/users"))
}

학습 팁

미들웨어 체인은 역순으로 적용되므로 chain(h, A, B, C)A(B(C(h)))가 됩니다. 실행 순서는 A → B → C → h입니다.

주의할 점

미들웨어에서 next를 호출하지 않으면 체인이 중단됩니다. 의도적 중단(인증 실패 등)이 아니라면 반드시 next를 호출하세요.

자주 묻는 질문

미들웨어 패턴란 무엇인가요?

함수를 감싸는 미들웨어 패턴으로 로깅, 인증, 복구 등 횡단 관심사를 분리합니다.

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

미들웨어에서 next 를 호출하지 않으면 체인이 중단됩니다. 의도적 중단(인증 실패 등)이 아니라면 반드시 next 를 호출하세요.