Golang은 net/http 모듈을 통해 http 서버를 구축할 수 있도록 제공한다. 기본적으로 http 모듈의 Server가 http2 를 자동으로 enable하고 있기 때문에 좀더 복잡하거나 low-level단의 http/2를 구축하기 위해서는 golang.org/x/net/http2를 별도로 사용한다.
net/http 모듈의 가장 기본이 되는 항목으로는 아래 두 가지가 있을 수 있다.
http.HandleFunc
요청한 라우팅 경로에 대한 함수를 지정한다. 예를 들어 아래와 같은 방식이다.
http.HandleFunc("/hello", hello)
http.HandleFunc("/some-api", apiHandler)
위의 함수를 예로 했을 때, /hello 서브 도메인으로 들어온 요청에 대해 hello 함수 동작을 실시한다.
응답하기위한 함수는 아래 구성을 취한다.
func someFunction ( w http.ResponseWriter, r *http.Request ) {}
Response를 전달하기 위한 ResponseWriter, 요청을 파싱하기 위한 Request 포인터로 구성된다.
Request를 가져오기 위한 Request 포인터를 반드시 파라메터로 가진다.
Response Body에 뭔가 내용을 전달하기 위해서는 ResponseWriter에 원하는 동작을 기입한다.
http.ListenAndServe
웹서버를 실제로 동작시키기 위한 함수다. 서버가 동작할 포트를 지정한다.
func ListenAndServe(addr string, handler Handler) error
포트는 string으로 지정하기 때문에 ":"를 붙여 작성한다. (예: ":8080")
handle에는 통상적으로 nil을 입력한다.
http서버 예제
예제 코드
package main
import (
"fmt"
"log"
"net/http"
)
func helloWorldHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello World!")
}
func main() {
http.HandleFunc("/", helloWorldHandler)
log.Fatal(http.ListenAndServe(":8080", nil))
}
HandleFunc와 ListenAndServe는 사용할 수 있는 가장 간단한 함수이기 때문에 세부 컨트롤이 필요없다면 이 두가지 함수 만으로도 충분히 서버를 구성할 수 있다.
만약 추가적인 구성을 하려면 아래와 같이 Handler, Timeout, HeaderBytes등을 구성할 수 있다.
s := &http.Server{
Addr: ":8080",
Handler: myHandler,
ReadTimeout: 10 * time.Second,
WriteTimeout: 10 * time.Second,
MaxHeaderBytes: 1 << 20,
}
log.Fatal(s.ListenAndServe())
이처럼 별도의 프레임워크없이 쉽게 서버를 구성할 수 있기 때문에 간단한 서버를 구성하기 아주 편하다는 장점을 가지고 있다.
참조
https://niceman.tistory.com/152