Go Web Programming: [03/02] Build a Simple Web Server

Build a Simple Web Server

앞 절에서 Web은 http 프로토콜에 기반한 서비스라고 설명 했습니다.
Go 언어에서는 net/http 패키지를 통해서 웹에 대한 전반적인 기능을 제공하고 있습니다.
http 패키지를 통해서 Web 서비스를 아주 쉽게 작성할 수 있습니다.
이와 동시에 이 패키지를 사용해서 쉽게 Web 라우팅 정적 파일, 템플릿, cookie 등의 데이터에 대해서 설정하고
조작 할 수 있습니다.

http 패키지로 Web 서버 제작

package main

import (
    "fmt"
    "net / http"
    "strings"
    "log"
)

func sayhelloName(w http.ResponseWriter, r *http.Request) {
    r.ParseForm()            // 옵션을 분석합니다. 기본적으로 분석하지 않습니다.
    fmt.Println(r.Form)      // 서버의 분석 데이터를 출력됩니다.
    fmt.Println("path"r.URL.Path)
    fmt.Println("scheme"r.URL.Scheme)
    fmt.Println(r.Form ["url_long"])
    for k, v := range r.Form {
        fmt.Println("key :", k)
        fmt.Println("val :", strings.Join(v, ""))
    }
    fmt.Fprintf(w,"Hello XenoStream!")  // w에 기록하는 것이 클라이언트에 출력 됩니다.
}

func main () {
    http.HandleFunc("/", sayhelloName)        // 접근 라우팅을 설정 합니다.
    err := http.ListenAndServe(": 9090", nil) // 대기하는 포트를 설정 합니다.
    if err != nil {
        log.Fatal("ListenAndServe :", err)
    }
}

위의 코드를 Web.go로 저장하고, go build web.go명령으로 빌드한 후, web.exe를 실행하면
9090 포트에서 http 연결 요청을 모니터링하며 대기 합니다.

웹 브라우저에서 http://localhost:9090을 입력하고 엔터키를 입력하면, 웹 브라우저의 화면에
Hello XenoStream! 이라는 문자열이 출력된 것을 알 수 있습니다.

웹 브라우저의 주소입력란에서 다음과 같이 입력하시길 바랍니다.

http://localhost:9090/?url_long=111&url_long=222

웹 브라우저에 출력 되는 내용은 무엇일까요? 서버에서 출력되는 내용은 다음과 같습니다.


그림 3.8 사용자가 Web에 액세스하여 입력한 정보를 서버에서 출력하는 정보

위의 코드에서 알 수 있듯이 Web 서버를 제작하는 것은 단지, http 패키지의 두가지 함수를 호출하는것
으로만 처리됨을 알 수 있습니다.

만약 PHP 프로그래머 였다면, 이런 궁금증이 생길수도 있겠습니다. nginx, apache와 같은 별도의 웹서버는 필요
하지 않나요? Go언어에서는 net/http 패키지에서 직접 tcp 포트를 감시하기 때문에 별도의 웹서버가 필요하지
않습니다. 예제에서 사용한 sayhelloName() 함수는 php의 컨트롤러(controller) 함수와 유사합니다.

만약 Python 프로그래머 였다면, tornado를 알고 있을 것입니다. 예제 코드와 유사함을 알 수 있습니다.
Go 언어는 Python과 같은 동적 언어와 비슷한 특성을 가지고 있습니다.

이렇듯, Go를 이용해서 Web 응용 프로그램을 작성하는 매우 간단하고 편리하기 까지 합니다.

만약 Ruby 프로그래머 였다면, ROR의 /script/server를 사용하는 것과 약간 유사함을 알 수 있습니다.

Go 언어를 통해서 간단한 몇 줄의 코드를 입력하는 것만으로도 web 서버를 제작할 수 있을을 알게 되었습니다.
또한 이렇게 생성된 Web 서버는 내부에서는 멀티스레드 특성을 지원 합니다.
이어지는 두 절에서 Go에서 Web 멀티스레드를 어떻게 구현해서 처리하는지를 자세히 설명 합니다.