728x90
반응형
728x170
  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{}로 등록하는 형태로 만들면 됩니다.

 

실제로 HandlerServeHTTP라는 함수 하나를 가지고 있는 인터페이스로

  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

728x90
반응형
그리드형
Bami