Golang Router에 이어서 다음으로 살펴볼 예시는 Middleware이다.
http request/response 중간에서 매개역할을 해주는 것으로 보면 된다.
중간에서 인증, 트래픽관리, 자동화 등을 통해 full로 받는 서버의 부담을 줄여주는 역할
Golang Gin Middleware
앞선 예시에 이어서 Middleware를 추가해봤다.
Latency로 요청에 대한 응답이 얼마나 걸리는지 출력하는 예시이다.
package main
import (
"github.com/gin-gonic/gin"
"net/http"
"time"
)
func Logger() gin.HandlerFunc {
return func(c *gin.Context) {
t := time.Now()
c.Next()
latency := time.Since(t)
c.Writer.Write([]byte("latency: " + latency.String()))
}
}
func setupRouter() *gin.Engine {
r := gin.Default()
r.Use(Logger())
v1 := r.Group("/api/v1")
{
v1.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
})
v1.GET("/hello/:name", func(c *gin.Context) {
name := c.Param("name")
c.String(http.StatusOK, "Hello %s", name)
})
}
return r
}
func main() {
r := setupRouter()
r.Run(":8080")
}
이렇게 custom middleware를 통해서 logging과 latency를 활용해봤는데, 인증, timeout등에도 활용할 수 있다.
Logger 함수에서 앞서 설명한 request에서 response body까지의 시간을 기록하고 setupRouter 함수에서 해당 메소드를 사용한다.
등록된 router들에 접속해보면
이런식으로 latency가 추가된 결과값을 확인할 수 있다.
추가로 간단하게 인증middleware를 사용한 예시를 보면
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func AuthMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
// Get the token from the request header
token := c.GetHeader("Authorization")
if token != "secret-token" {
c.JSON(http.StatusUnauthorized, gin.H{
"error": "unauthorized",
})
c.Abort()
return
}
c.Next()
}
}
func setupRouter() *gin.Engine {
r := gin.Default()
r.Use(AuthMiddleware())
v1 := r.Group("/api/v1")
{
v1.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
})
v1.GET("/hello/:name", func(c *gin.Context) {
name := c.Param("name")
c.String(http.StatusOK, "Hello %s", name)
})
}
return r
}
func main() {
r := setupRouter()
r.Run(":8080")
}
Middleware를 통해 Authorization에 secret-token가 있는지 검사하는 예시이다.
Header에 Authorization: secret-token을 보내지 않을 시
context에서 바로 Abort하여 이렇게 Middleware에서 unauthorized를 바로 리턴한다.
제대로 Header에 Authorization: secret-token을 보내게 되면 context에서 Next함수를 호출하고 정상적으로 출력이 된다.
$ curl --request GET 'http://localhost:8080/api/v1/ping' \
--header 'Authorization: secret-token'
#response
{
"message": "pong"
}
이렇듯 Middleware를 사용해서 로깅, 인증, 권한 등 다양하게 활용 가능하고 서버의 부하를 줄이고 역할을 분담할 수 있다.
'개발 > 개발공부' 카테고리의 다른 글
Golang ORM library / gorm, xorm, sqlboiler, 비교 (2) | 2023.02.19 |
---|---|
Golang Gin Graceful restart, stop / golang, go, 고랭, 고, 언어 (2) | 2023.02.16 |
Golang Gin Router / golang, go, 고랭, 고, 언어, 라우터 (0) | 2023.02.04 |
Golang Gin Framework 시작 / golang, go, 고랭, 고, 언어, 진, 프레임워크 (0) | 2023.02.03 |
Kubernetes DaemonSet / 쿠버네티스, 데몬셋, 서비스, Pattern, 패턴 (0) | 2023.01.28 |
댓글