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를 호출하면 다음과 같은 결과가 표시됩니다.
지리정보시스템