회사 프로젝트에서는 go의 기본 net/http 모듈과 라우터패키지인 gorilla/mux 만 사용해서 웹 서비스를 구현했었다.
현재 GO 언어 웹 프레임워크 중 유명한 Gin을 한번 사용해보려고 한다.
아래 페이지는 Go 웹프레임워크들의 순위를 매겨놓은 페이지인데, Gin이 현재 1위인듯..
https://github.com/mingrammer/go-web-framework-stars
Gin 웹 프레임워크 Github 페이지
https://github.com/gin-gonic/gin
튜토리얼과 메뉴얼이 굉장히 잘 되어있는 편인 것 같다.
아래 내가 진행해 볼 내용은 Gin 튜토리얼에 나와 있다.
Gin 설치
go get -u github.com/gin-gonic/gin
Quick Start 맛보기
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()
}
위와 같이 main.go를 작성하고, 아래 명령어로 실행한다.
$ go run main.go
브라우저에서 localhost:8080/ping 으로 접속해보면,
위와 같이 출력된다.
본격적으로 Gin 예제 진행
Gin 에서는 Go 패키지를 관리해주는 벤더 툴인 govendor를 이용해서, 패키지 관리를 하는 것을 권하고 있다.
Go로 웹서비스 프로젝트를 했었지만, 이런 패키지 관리 툴이 있는 줄 몰랐다..;
govendor 설치
$ go get github.com/kardianos/govendor
프로젝트 폴더로 이동
$ govendor init
$ govendor fetch github.com/gin-gonic/gin@v1.3
gin 의 main.go starting template
https://raw.githubusercontent.com/gin-gonic/examples/master/basic/main.go
main.go
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
var db = make(map[string]string)
func setupRouter() *gin.Engine {
// Disable Console Color
// gin.DisableConsoleColor()
r := gin.Default()
// Ping test
r.GET("/ping", func(c *gin.Context) {
c.String(http.StatusOK, "pong")
})
// Get user value
r.GET("/user/:name", func(c *gin.Context) {
user := c.Params.ByName("name")
value, ok := db[user]
if ok {
c.JSON(http.StatusOK, gin.H{"user": user, "value": value})
} else {
c.JSON(http.StatusOK, gin.H{"user": user, "status": "no value"})
}
})
// Authorized group (uses gin.BasicAuth() middleware)
// Same than:
// authorized := r.Group("/")
// authorized.Use(gin.BasicAuth(gin.Credentials{
// "foo": "bar",
// "manu": "123",
//}))
authorized := r.Group("/", gin.BasicAuth(gin.Accounts{
"foo": "bar", // user:foo password:bar
"manu": "123", // user:manu password:123
}))
authorized.POST("admin", func(c *gin.Context) {
user := c.MustGet(gin.AuthUserKey).(string)
// Parse JSON
var json struct {
Value string `json:"value" binding:"required"`
}
if c.Bind(&json) == nil {
db[user] = json.Value
c.JSON(http.StatusOK, gin.H{"status": "ok"})
}
})
return r
}
func main() {
r := setupRouter()
// Listen and Server in 0.0.0.0:8080
r.Run(":8080")
}
위와 같이 작성하고, 실행
$ go run main.go
localhost:8080/ping 접속
Gin 웹프레임워크를 사용해보면서 느낀 것은, 초기에 설정하는 부분이나 라우터의 생김새가 node.js와 비슷하다는 느낌을 받았다. 물론 내부적으로는 전혀 다르게 동작하겠지만, node.js를 하던 개발자도 쉽게 적응할 수 있을 것 같다.
node.js 대비 강점은, 퍼포먼스 (성능) 에서 Gin이 월등히 앞설 것이다. 그리고 Go 로 API서버를 구축하고자 할 때, 굉장히 생산성이 좋을 것 같다.