package main
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { // 1
fmt.Fprint(w, "Hello World") // 2
})
http.ListenAndServe(":3000", nil) // 3
1 : http.HandleFunc으로 선언 하여 경로는 처음 경로인 "/"으로 해주고, 함수 타입을
w http.ResponseWriter, r *http.Request"
으로 넣어줍니다.
2 : 함수의 내용.
3 : port 번호 3000으로 지정 합니다.
여기서 중요한 건 http.HandleFunc, http.ListenAndServe인데 HandleFunc은 어떤 Handler를 등록하는 것입니다.
어떤 경로에 해당하는 Request가 들어 왔을 때 어떤 일을 할 것인지 그 Handler를 등록하는 Function인데요.
여기서는 초기경로인 "/"에 대한 Request가 왔을 때 어떤 일을 할 것 인지 지정한 것입니다.
그래서 func 안에 Response를 Writer할 수 있는 w 인자, 사용자가 요청한 Request정보를 저장하는 r인자가 있는 것입니다.
Fprint(w, "Hello World")는 'request 보낸 쪽에 Hello World라는 Response를 줘라'는 의미입니다.
그리고 ListenAndServe이라는 곳에 기다리는 포트를 적어줍니다.
이제 main()안에 또 다른 Handler를 추가해봅시다.
http.HandleFunc("/bar", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Hello Bar!")
})
'/bar' 라는 경로에 진입 했을 때의 Handler를 추가했습니다.
추가로
type fooHandler struct{}
으로 비어있는 struct를 만들고, fooHandler의 인스턴스의 메소드를 만들어 줍니다.
func (f *fooHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Hello Foo!")
}
다시 main함수에 돌아와서 맨 아래줄에
http.Handle("/foo", &fooHandler{})
를 추가해줍니다. 이 상태에서 실행을 하면
Foo Handler도 추가 됐음을 알 수 있습니다.
지금까지 3가지의 Handler를 추가했는데 "/", "/bar"의 Handler와 "/foo"의 Handler가 다릅니다.
"/", "/bar"의 Handler는 func형태로 직접등록하여 사용한 상태이고, "/foo"의 Handler는 인스턴스 형태로 등록할 때 많이 쓰이는 형태인데 인스턴스로 등록 할 때는 위와 같이 어떤 인스턴스를 만들고,
type fooHandler struct{}
func (f *fooHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Hello Foo!")
}
거기에 해당하는 ServeHTTP라는 인터페이스를 구현해서 그 인터페이스를 구현한 것을 &fooHandler{}
로 등록하는 형태로 만들면 됩니다.
실제로 Handler는 ServeHTTP라는 함수 하나를 가지고 있는 인터페이스로
type Handler interface {
ServeHTTP(ResponseWriter, * Request)
}
형태로 이루어져 있습니다.
풀 소스
package main
import (
"fmt"
"net/http"
)
type fooHandler struct{}
func (f *fooHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Hello Foo!")
}
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Hello World")
})
http.HandleFunc("/bar", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello Bar!")
})
http.Handle("/foo", &fooHandler{})
http.ListenAndServe(":3000", nil)
}
출처 : Turker의 Golang
'프로그래밍(Web) > Golang' 카테고리의 다른 글
[바미] Go - RESTful API(POST) (0) | 2020.12.17 |
---|---|
[바미] Go - RESTful API(GET) (0) | 2020.12.16 |
[바미] Go - File Upload 만들기. (0) | 2020.12.16 |
[바미] Go - test환경 만들기 (0) | 2020.12.16 |
[바미] Go - 간단한 JSON Transfer 만들기. (0) | 2020.12.16 |