Go로 웹 어플리케이션을 만들기 위해 사용하는 web handler에 대해 알아보자
Go에서 HTTP 서버를 만들기 위해서는 net/http 패키지를 이용하곤 한다. http 패키지에는 다양한 메서드들이 존재하는데 이번 포스팅에서는 각각의 메서드의 역할에 대해 간단하게 알아보고자 한다.
ListenAndServe()
ListenAndServe(addr string, handler Handler) error
가장 먼저 기본이 되는 ListenAndServe()부터 알아보자. ListenAndServe() 메서드는 지정된 포트에 웹 서버를 열고 HTTP 연결을 받아 요청에 응답하는 역할을 한다. 해당 메서드에 handler를 등록하면 지정한 포트에 들어온 요청에 대해 handler에서 등록한 처리 방법에 따라 처리된다.
Handle()
Handle(pattern string, handler Handler)
Handle()는 인자로 Handler가 필요하다. Handler는 ServeHTTP를 가지고 있는 인터페이스이기 때문에 ServeHTTP를 구현만 해주면 인자로 등록할 수 있다.
type fooHandler struct{}
func (f *fooHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
...
}
http.Handle("/foo", &fooHandler{})
HandleFunc()
HandleFunc(pattern string, handler func(ResponseWriter, *Request))
HandleFunc()는 경로별로 요청을 처리할 방법을 만드는 핸들러 함수를 등록한다.
http.HandleFunc("/bar", func(res http.ResponseWriter, req *http.Request){
fmt.Fprint(w, "Hello, World")
})
or
func barHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Hello, World")
}
http.HandleFunc("/bar", barHandler)
위의 함수는 /bar 경로로 요청이 들어왔을 때 Hello, World라는 값을 출력해주도록 했다. 이 메서드를 사용하면 handle()을 사용할 때 ServeHTTP를 매번 구현해주어야 하는 번거로움을 해결할 수 있다.
NewServeMux()
NewServeMux() *ServeMux
HTTP 요청 멀티플렉서 인스턴스를 생성한다. HTTP 요청 멀티플렉서는 URL 경로가 다양해지면 모든 경로를 관리하는 것이 어렵기 때문데 ServeMux를 통해 패턴에 맞는 핸들러를 등록하면 등록한 패턴과 동일한 요청이 오면 해당 경로에 등록한 handler를 호출해준다.
mux := http.NewServeMux()
mux.HandleFunc("/", indexHandler)
mux.HandleFunc("/bar", barHandler)
mux.Handle("/foo", &fooHandler{})