본문 바로가기
개발/개발공부

Golang Gin Middleware / golang, go, 고랭, 고, 언어, 미들웨어

by 치킨개발자 2023. 2. 7.
728x90

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들에 접속해보면

http://localhost:8080/api/v1/ping 접속시
http://localhost:8080/api/v1/hello/test 접속시

이런식으로 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을 보내지 않을 시

Auth middleware http://localhost:8080/api/v1/hello/test 예시

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를 사용해서 로깅, 인증, 권한 등 다양하게 활용 가능하고 서버의 부하를 줄이고 역할을 분담할 수 있다.

반응형

댓글