gin-gonic/gin
Gin is a HTTP web framework written in Go (Golang). It features a Martini-like API with much better performance -- up to 40 times faster. If you need smashing performance, get yourself some Gin. - ...
Gin Web Framework
Gin Web Framework

Go언어의 대표적인 마이크로 웹 프레임워크 입니다. PythonFlask의 관계와 비슷 합니다.

Gin 은 MIT 라이선스를 사용합니다.
https://github.com/gin-gonic/gin/blob/master/LICENSE

다음 명령으로 Gin 을 받습니다.

go get github.com/gin-gonic/gin

간단한 서버를 만들자

main.go 를 다음처럼 작성 후 실행합니다.

package main

import "github.com/gin-gonic/gin"

func main() {
	r := gin.Default()
	r.GET("/ping", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "pong",
		})
	})
	r.Run() // listen and serve on 0.0.0.0:8080
}
$ go run main.go
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.

[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
 - using env:   export GIN_MODE=release
 - using code:  gin.SetMode(gin.ReleaseMode)

[GIN-debug] GET    /ping                     --> main.main.func1 (3 handlers)
[GIN-debug] Environment variable PORT is undefined. Using port :8080 by default
[GIN-debug] Listening and serving HTTP on :8080

웹 브라우저로 localhost:8080/ping 에 접속하면 다음처럼 pong 메세지가 응답 됩니다.

Gin 엔진 만들기 (Gin 라우터)

r := gin.Default()
r := gin.New()

Default() 함수로 Gin 엔진을 만듭니다. 로거 없는 엔진을 사용하려면 New() 함수를 사용합니다.

라우팅 설정

URI 바인딩

r.GET("/url/path", handleFunc)
r.POST("/url/path", handleFunc)
r.HEAD("/url/path", handleFunc)
r.OPTIONS("/url/path", handleFunc)
r.PUT("/url/path", handleFunc)
r.DELETE("/url/path", handleFunc)

r.Handle("GET", "/url/path", handleFunc)

위 함수로 라우팅을 설정 합니다.

첫 번째 인자로 라우팅 할 URL을, 두번째 인자로 핸들 함수를 넣어줍니다.

:* 로 파라미터를 사용할 수 있습니다.

1. r.GET("/user/:name", ... )
2. r.GET("/user/:name/*action", ... )
3. r.GET("/user/groups", ... )
  1. /user/jhon, /user/chris 에 매칭 됩니다. /user, /user/ 는 매칭되지 않습니다.
  2. /user/jhon/, /user/jhon/info, /user/jhon/info/age 에 매칭 됩니다.
  3. /user/groups 는 1번에 매칭되지 않고, 본 함수에 매칭 됩니다.

핸들러 함수

핸들 함수는 다음처럼 함수를 선언 하거나

func main() {
	r := gin.New()

	r.GET("/url/path", handleFunc)

	r.Run() // listen and serve on 0.0.0.0:8080
}

func handleFunc(c *gin.Context) {
	c.JSON(http.StatusOK, gin.H{
		"message": "ok",
	})
}

익명 함수를 사용하거나

func main() {
	r := gin.New()
	
	handleFunc := func (c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{
			"message": "ok",
		})
	}

	r.GET("/url/path", handleFunc)

	r.Run() // listen and serve on 0.0.0.0:8080
}

인 라인으로 사용합니다.

func main() {
	r := gin.New()

	r.GET("/url/path", func (c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{
			"message": "ok",
		})
	})

	r.Run() // listen and serve on 0.0.0.0:8080
}

핸들 함수는 다음처럼 *gin.Context 를 인자로 받고 리턴이 없는 함수로 작성 합니다.

func handleFunc(c *gin.Context) {
	return
}