Go 언어는 그 목적 중에 하나로 빠르고 효율적인 서버 어플리케이션 개발에 있는데요. 타 언어와는 다르게 Go는 웹서버 개발을 위한 별도의 외부 라이브러리의 도움 없이 기본 라이브러리만으로도 뛰어난 웹서버를 개발할 수 있습니다. Go 언어를 이용한 간단한 웹서버 예제를 정리해 둡니다.
이 웹서버는 2개의 URL 정의를 통해 1:1로 매칭되는 2가지 기능을 제공합니다. 예를들어서 URL이 /list로 끝나는 것과 /mean으로 구성되는 것인데요. 첫번째는 미리 정의해둔 단어와 그 의미들에 대한 목록을 서비스하고, 두번째는 QueryString으로 word 파라메터에 지정한 단어의 의미를 서비스하는데, 예를들어 http://localhost:8000/mean?word=GIS라고 하면 GIS의 의미를 문자열로 서비스합니다.
먼저 단어와 그 의미를 저정하는 map을 dic라는 타입으로 정의하고 앞서 언급한 2개의 URL 정의에 대한 서비스로 사용할 매서드를 dic 타입에 추가합니다. 아래 코드가 이에 대한 것입니다.
type dic map[string]string func (msg dic) list(w http.ResponseWriter, req *http.Request) { for word, mean := range msg { fmt.Fprintf(w, "%s: %s\n", word, mean) } } func (msg dic) mean(w http.ResponseWriter, req *http.Request) { word := req.URL.Query().Get("word") mean, ok := msg[word] if !ok { w.WriteHeader(http.StatusNotFound) return } fmt.Fprintf(w, "%s\n", mean) }
데이터 저장을 위한 저장소와 이 데이터를 서비스할 매서드 정의가 끝났으니, 이를 활용하는 코드가 필요한데요. 활용하는 코드라 함은 저장소에 몇가지 단어와 그 의미를 담고, 웹서버를 만들어 웹서버가 서비스할 URL을 정의하는 것입니다. 아래의 코드가 이에 대한 것입니다.
func main() { msg := dic{ "GIS": "지리정보시스템", "BIM": "빌딩정보시스템", "CAD": "컴퓨터를 이용한 디자인", "Dip2K": "Deeper Into Purity Since 2000", } http.HandleFunc("/list", msg.list) http.HandleFunc("/mean", msg.mean) log.Fatal(http.ListenAndServe("localhost:8000", nil)) }
이제 실행하고 웹브라우저에서 http://localhost:8000/list를 호출하면 다음과 같은 결과를 볼 수 있습니다.
GIS: 지리정보시스템 BIM: 빌딩정보시스템 CAD: 컴퓨터를 이용한 디자인 Dip2K: Deeper Into Purity Since 2000
그리고 http://localhost:8000/mean?word=GIS를 호출하면 다음과 같은 결과가 표시됩니다.
지리정보시스템