컨텐츠로 건너뛰기

미들웨어

Gin의 미들웨어는 HTTP 요청이 라우트 핸들러에 도달하기 전에 처리하는 방법을 제공합니다. 미들웨어 함수는 라우트 핸들러와 동일한 시그니처(gin.HandlerFunc)를 가지며, 일반적으로 c.Next()를 호출하여 체인의 다음 핸들러에 제어를 전달합니다.

미들웨어 작동 방식

Gin은 미들웨어 실행에 어니언(양파) 모델을 사용합니다. 각 미들웨어는 두 단계로 실행됩니다:

  1. 핸들러 전c.Next() 이전의 코드는 라우트 핸들러 전에 실행됩니다.
  2. 핸들러 후c.Next() 이후의 코드는 라우트 핸들러가 반환된 후에 실행됩니다.

이는 미들웨어가 양파의 겹처럼 핸들러를 감싸는 것을 의미합니다. 첫 번째로 부착된 미들웨어가 가장 바깥쪽 계층입니다.

func Logger() gin.HandlerFunc {
return func(c *gin.Context) {
start := time.Now()
// 핸들러 전 단계
c.Next()
// 핸들러 후 단계
latency := time.Since(start)
log.Printf("Request took %v", latency)
}
}

미들웨어 부착

Gin에서 미들웨어를 부착하는 세 가지 방법이 있습니다:

// 1. 전역 -- 모든 라우트에 적용
router := gin.New()
router.Use(Logger(), Recovery())
// 2. 그룹 -- 그룹의 모든 라우트에 적용
v1 := router.Group("/v1")
v1.Use(AuthRequired())
{
v1.GET("/users", listUsers)
}
// 3. 라우트별 -- 단일 라우트에 적용
router.GET("/benchmark", BenchmarkMiddleware(), benchHandler)

더 넓은 범위에서 부착된 미들웨어가 먼저 실행됩니다. 위 예제에서 GET /v1/users 요청은 Logger, Recovery, AuthRequired, listUsers 순으로 실행됩니다.

이 섹션의 내용