Go가 정말 좋은점은 도큐먼트가 굉장히 잘 돼 있다는 점인듯 하다. 아주 간단한 함수에게도 자세한 주석과 도큐먼트에 정리가 잘 돼 있다. 이점을 잘 활용한다면 어렵지 않게 웹 서버와 만들고자 하는 웹을 구축할 수 있을 것이다.
Open Web Server
package main
import (
"fmt"
"log"
"net/http"
)
const port string = ":4000"
func home(rw http.ResponseWriter, r *http.Request) {
fmt.Fprintf(rw, "%s", "Hello go web")
}
func main() {
http.HandleFunc("/", home)
fmt.Printf("test on http://localhost%s\n", port)
log.Fatal(http.ListenAndServe(port, nil))
}
간단하게 "Hello go web"을 출력하는 웹 페이지를 만든 모습이다.
실행 결과
코드 설명
const port string = ":4000"
const를 이용해 4000번 포트를 사용하겠다는 의지를 보여준다.
func main() {
http.HandleFunc("/", home)
fmt.Printf("test on http://localhost%s\n", port)
log.Fatal(http.ListenAndServe(port, nil))
}
먼저 main함수를 살펴보는 것이 이해가 더 잘 될듯 하다.
http.HandleFunc에 작성된 주석을 살펴보자.
HandleFunc registers the handler function for the given pattern in the DefaultServeMux. The documentation for ServeMux explains how patterns are matched.
지정된 패턴을 DefaultServeMux에 넘겨 주는 일을 하는 함수이다. 여기서 Mux란 Multiflexer를 줄인 말이며 이는 원하는 url로 request를 넘겨주는 일을 하는 인스턴스이다. url을 지켜보고 내가 원하는 함수를 실행하게 해주는 함수라 알아 두면 된다.
실행시 실행 주소와 port를 출력하게 하는 출력함수를 작성했다.
log.Fatal함수는 ListenAndServe함수에서 error가 발생될 시 error code 1로 프로그램을 종료하기 위한 함수이다. 이를 사용한 이유는 http.ListenAndServe함수가 err를 반환하기 때문이다.
ListenAndServe함수의 매개변수를 살펴보자. Port는 웹 서버를 여는데 사용하기 위한 포트이다. 그 뒤의 nil은 ServeMux를 지정하는 매개변수이다. 예제에서는 ServeMux를 DefaultServeMux를 사용해도 충분하기에 nil을 넘겨준 것이다.
func home(rw http.ResponseWriter, r *http.Request) {
fmt.Fprintf(rw, "%s", "Hello go web")
}
localhost:4000의 루트 페이지에 페이지를 렌더링하기 위한 함수이다.
http.ResponseWriter에 적혀있는 주석을 살펴보자.
A ResponseWriter interface is used by an HTTP handler to construct an HTTP response.
인터페이스이고 HTTP의 응답을 구성하는데 사용된다고 친절하게 적어놓았다. 이를 통해 내가 만든 페이지에 유저에게 전달하고자 하는 값을 전달할 수 있다.
다음은 http.Request를 살펴보자
A Request represents an HTTP request received by a server or to be sent by a client.
서버가 수신했거나 클라이언트가 보내는 요청을 나타낸다.
이 두 매개 변수는 기본적으로 웹페이지와의 반응을 위해 사용되는 기본적인 요소이기에 http.HandleFunc의 매개변수 hanlder로 익명함수를 사용하고자 할때 short cut으로 자동으로 채워준다.
Fprintf는 format형식을 이용하여 특정 Writer에 값을 쓰는 방식이다. 여기서는 rw에 "Hello go web"을 쓴 모습이다.
결론
어떤 프레임워크도 사용하지 않고도 Go를 통한 웹 서버를 구축하는 것은 굉장히 간편한듯 하다. 간결하고 강력한 코드 덕도 있지만 이를 잘 사용할 수 있게 해주는 주석과 도큐먼트는 정말 최고다.
'Study > Go' 카테고리의 다른 글
[Go] 고루틴(Goroutine) 알고쓰기(1) - 동시성, 병렬성 프로그래밍 그리고 고루틴 (0) | 2021.09.01 |
---|---|
[Go] Json 활용 방법 (0) | 2021.08.12 |
[Go] Slice와 Array 알고 쓰기 (0) | 2021.07.21 |
[Go] GC(Garbage Collector) (0) | 2021.07.18 |
[Go] C++ 과 Go 포인터의 차이 (0) | 2021.07.17 |