0. 소개


Go 언어의 표준 라이브러리인 net/http 패키지를 이용하여 간단한 웹 서버를 열어보겠습니다.

1. HTTP?


HTTP(HyperText Transfer Protocol)는 w3 상에서 데이터를 주고 받기 위해 만든 전송 규약입니다.

데이터를 요청(request)하는 클라이언트(Client)와 데이터를 응답(response)하는 서버(Server)로 구성됩니다.

2. 요청 핸들러 등록


먼저 HTTP 클라이언트 요청을 수신하는 핸들러를 만듭니다.

http.HandleFunc의 시그니처는 다음과 같습니다.

1
func HandleFunc(pattern string, handler func(ResponseWriter, *Request))

“/” 경로로 요청이 들어오면 “Hello, World!”를 보내봅시다.

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

3. 포트 설정


포트(Port)는 외부와 통신을 하기 위해 만든 연결 부분입니다. 데이터가 들어오는 항구(Port)라고 생각하면 됩니다. HTTP는 기본적으로 80포트를 사용합니다. HTTP 프로그램이 80포트를 계속 확인하고 있다가 요청에 응답하는 것입니다.

이렇게 계속 요청을 확인하는 것을 “듣는다(Listening)”라고 표현합니다.

1
http.ListenAndServe(":8080", nil)

80포트는 이미 사용 중 일수도 있기 때문에 8080포트를 사용하겠습니다.

만일 포트 충돌이 발생한다면, 다른 포트번호를 넣어주면 됩니다.

4. 전체 코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
package main

import (
"fmt"
"net/http"
)

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

http.ListenAndServe(":8080", nil)
}
1
go run server.go

https://i.ibb.co/T2f4xKX/2022-03-31-4-38-19.png

5. http.ResponseWriter 이해


핸들러의 코드를 다시 한번 봅시다.

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

C언어의 File I/O를 해봤던 분들이라면 해당 코드를 쉽게 이해할 수 있을 겁니다.

네트워크 통신도 일종의 I/O 과정입니다. 이 부분을 이해하기 위해서는 파일 디스크립터를 공부해보세요!

다시 본론으로 돌아와서 다른 방법으로 응답해보겠습니다.

1
2
3
http.HandleFunc("/", func (w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello, World!"))
})

http.ResponseWriter.Wrtie 메소드는 byte 배열을 인자로 받습니다. 따라서 string을 []byte로 캐스팅 해줍니다. 이 방법 말고도 io 패키지를 이용하는 방법도 있습니다.

6. 결론


HTTP 요청을 받는 핸들러를 등록하고 포트를 할당하면 기본적인 웹 서버 구축됩니다.

http.ResponseWriter는 파일 디스크립터처럼 사용되므로 io관련 패키지들로 쓸 수 있습니다.

참고


https://gowebexamples.com/hello-world/