[Go] Go Web Programming Basic 01

Build a basic web server

Go 언어는 가볍고 빠르며, 효율적인 자원 사용으로 현재 매우 인기가 급상승하고 있는 프로그래밍 언어이다.

서버 개발 및 웹 서비스까지 매우 다양한 용도로 이용되고 있으며, 이번 아티클에서는 간단하게 웹 서비스를 수행할 하는 예제를 작성해 볼 것이다.

Go http 모듈

우리는 우선 간단한 웹 서버를 만들어 볼 것이다.

https://godoc.org/net/http 에서 net/http 모듈을 사용하여 간단한 웹 서버를 만든다.

Hello World 서버

package main

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

func main() {

	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintf(w, "Hello, World")
	})

	fmt.Println("Server start on port: ", 8080)
	log.Fatal(http.ListenAndServe(":8080", nil))
}

위 코드는 가장 기본적인 HelloWorld 를 응답하는 코드이다.

  • net/http: 특정 서버로 web 요청을 보내거나, 웹 서버를 생성할 수 있는 모듈이다.
  • http.HandleFunc: http.HandleFunc를 이용하면 특정경로 “/” 로 요청이 들어오면, 다음 파라미터인 func 가 수행되되어 응답이 처리된다.
  • w http.ResponseWriter: 서버 처리 결과를 응답으로 내려 보내기 위한 Writer 이다.
  • r *http.Request: 요청을 담고 있는 포인터 객체이다. 요청이 들어오면 요청의 URI, 파라미터, body 등의 내용을 참조할 수 있다.
  • http.ListenAndServe: 웹 서버를 수행한다. 첫번째 파라미터는 호스트명:포트 이며, 두번째 파라미터는 Handler 이다.

Handler 는 타 웹 프로그램에서 컨트롤러로 불리기도 하며, 한마디로 요청에 대한 처리를 담당하는 함수를 말한다.

테스트 하기.

콘솔 화면에서 다음과 같이 실행하자.

 go run main.go
Server start on port:  8080

서버가 정상으로 기동 되었다.

 curl http://localhost:8080
Hello, World

원하는 응답을 받았다는 것을 확인할 수 있다.

URI 추출하기.

이번에는 요청한 URI 를 추출하여 URI 패스를 반환하는 예제를 확장해보자.

main.go 파일에 다음과 같이 핸들러를 추가하자.

... 생략 

	http.HandleFunc("/path/value", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintf(w, "Your request path is :%q", html.EscapeString(r.URL.Path))
	})

... 생략

위 내용에서 달라진 것은 html.EscapeString … 이 부분이다.

  • html.EscapeString(r.URL.Path): Request 객체에서 요청한 URL 을 조회하고, 그중 Path 를 통해서 URI 를 조회한다. 이후 스트링을 Escape 처리한다.
  • EscapeString: 특수한 캐릭터 문자를 변환한다. <, >, &, ‘ and “ 값을 안전한 문자로 변경한다.

결과 확인하기.

다시 go run main.go 를 수행하고 다음과 같이 요청을 보내보자.

curl http://localhost:8080/path/value
Your request path is :"/path/value"

경로만 반환되었음을 알 수 있다.

Wrap Up

지금까지 go 를 이용하여 간단한 웹 서비를 만들어 보았다.

이미 제공하는 내장 모듈을 사용하여 쉽게 구현할 수 있었다. 그러나 위처럼 순수하게 http 모듈만을 이용해서는 웹 개발을 하기 위해서 조금 손이 고생해야한다.

다음번에는 라이블러리를 이용하여 웹 서버를 구현해 볼 것이다.

관련 Git 에서 소스코드를 확인 가능