golang - web
시작
기본적으로 필요한 것은 net/http 패키지에 있다.
import "net/http"
이것만으로 기본적인 HTTP 리퀘스트와 리스폰에 관한 처리를 실시할 수 있다
http.Handle("/foo", fooHandler)
http.HandleFunc("/bar", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path))
})
log.Fatal(http.ListenAndServe(":8080", nil))
여기서 http.Handle, http.HandleFunc을 사용하면 DefaultServerMux 이라는 것에 매핑이 등록된다.
ServeMux
- ServeMux = HTTP request multiplexer
- 리퀘스트를 등록된 URL 패턴 리스트와 대조하고 매치된 Handler를 호출
- 복수 매치한 경우는 매치가 긴쪽을 우선한다
- eg “/images/thumbnails/”,”/images/”,”/” 라는 순
- 거꾸로 말하면 “/”는 모든 리퀘스트에 매치한다. 그래서 정말 “/”는 Handler측에서 점검할 필요가 있다.
mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
// The "/" pattern matches everything, so we need to check
// that we're at the root here.
if req.URL.Path != "/" {
http.NotFound(w, req)
return
}
fmt.Fprintf(w, "Welcome to the home page!")
})
gorilla/mux
- http://www.gorillatoolkit.org/pkg/mux
- 기본 ServerMux(Router)는 무력한 것으로 gorilla/mux 라는 라이브러리가 인기를 끌고 있다
r := mux.NewRouter()
r.HandleFunc("/products/{key}", ProductHandler)
r.HandleFunc("/articles/{category}/", ArticlesCategoryHandler)
r.HandleFunc("/articles/{category}/{id:[0-9]+}", ArticleHandler)
vars := mux.Vars(request)
category := vars["category"]
이렇게 편리하게 Routing이 되다.
Middleware
- https://mattstauffer.co/blog/laravel-5.0-middleware-filter-style#what-is-middleware
어플리케이션 로직(직접 써서 Router와 Controller가 할 부분)을 실행하는 전후에 뭔가 할 것. 이 그림에서 보면 녹색이 어플리케이션 로직으로 그 주변에 있는 것이 미들 웨어.
negroni
- https://github.com/codegangsta/negroni
- 미들웨어를 사용 시 현재 인기를 모으고 있는 라이브러리가 negroni
- 이것은 matini 이라는 인기가 많은 Web Framework의 작자가 Go 적이지 않다는 비판을 받고, 그래서 다시 쓴 것.
- 이것과 gorilla/mux를 조합하여 웹 앱을 만드는 web 서적도 있다(https://github.com/astaxie/build-web-application-with-golang/blob/master/ja/preface.md).
WebFramework
Revel
- http://revel.github.io/
- Go언어 중에서 가장 튼튼한 프레임워크. Rails과 비슷.
Martini
- http://martini.codegangsta.io/
- Revel보다 가벼운 Sinatra풍의 프레임워크.
Negroni
- Martini의 작자가 Go적인 Middleware만의 체제로 한 것.
- 라우팅은 gorilla/mux 조합하는 등 미들웨어의 부분만을 최소로 구현한 것.
Gin
- http://gin-gonic.github.io/gin/
- Matini와 같은 경량 프레임워크. 다만 Matini보다 20배에서 45배 빠르다고 한다.
Go-Json-Rest
- https://github.com/ant0ine/go-json-rest
- Restfull한 JSON API를 제공하기 쉽다. auth, JSONP, gzip 등에도 대응 할 수 있다.
- 충실한 example이 있다. https://github.com/ant0ine/go-json-rest-examples
이 글은 2018-12-04에 작성되었습니다.