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에 작성되었습니다.