golang http Server Router 설정하기

2020. 4. 16. 11:45golang/golang-webServer

golang http Server Router 설정하기

[golang/golang-webServer] - golang http server 시작하기

ServeMux

ServMux는 http package에서 추출된 구조체 타입이다. 들어오는 모든 요청을 처리하 수 있기때문에 ListenAndServe의 argument handler 또한 multiplexer이다. 

 

당연히 ServeMux의 객체를 만들어서 handler argument에 넣어줄 수 있다. 이전 글의 예제에서 자기가 원하는 url path를 설정하여 요청을 받을 수 있다. 해당 url을 받은 후 그에 필요한 연산 및 특정한 응답을 해줍니다.

 

만약 ServeMux가 /api/, /api/users 리우트를 갖고 있고 client가 /api/users로 요청을 하면 더 비슷한 /api/users로 요청이 들어옵니다.

 

반면 client의 /api 요청은 /api, /apu/bla/bla 등에 맞게 실행된다.

 

type ServeMax struct{
}

 

위 코드를 보면 ServeMux는 구조체이고 아무 field를 가지지 않는다. 하지만 숨겨진 field route path와 handler function을 따라오는 데이터와 함께 갖는다.

 

ServeMux 객체를 갖기 위해서 http.NewServeMux를 호출해야한다. 

 

mux := http.NewServeMux()

 

ServeMux 또한 ServeHTTP를 구현해야한다. ServeMux가 구현한 ServeHTTP를 적절한 path에 맞춰서 handler에 넘겨주어야한다. 

 

HandleFunc(route string, handler func(ResponseWriter, *Request))

모든 route 및 handler function을 mux에 등록하고 난다음에 ListenAndServe 호출할 때 넘겨주어야한다. 

 

package main

import ("fmt"
		"net/http"
)

func main(){
	mux := http.NewServeMux()
    mux.HandleFunc("/", func(res http.ResponseWriter, req *http.Request){
    	fmt.Fprint(res, "Hello World!")
    })
    
    mux.HandleFunc("/hello/golang", func(res http.ResponseWriter, req *http.Request){
    	fmt.Fprint(res, "Hello Golang")
    })
    
 	http.ListenAndServe(":9000", mux)
}

 

만약 URL이 위와 다른 것이 실행되어도 /hello/gola or /hello 라고 입력해도 hello/golang으로 연결된다.

 

다른데 왜그러는 것일까? ServeMux의 경우 hello/gola랑 hello/golang이랑 gola와 golang은 다른데 이전의 /hello가 동일하기 때문에 hello/golang이 실행된다. 만약 /hello가 등록 되지 않다면 더 뒤의 /로  체크한다.

 

http.DefaultServeMux 사용하기

이전에 ListenAndServe 함수의 handler 부분에 nil을 넘겨 줄 수 있다고 했다. nil을 넘겨주면 go는 내부적으로 http.DefaultServeMux를 사용한다. http.DefaultServeMux는 global ServeMux 객체이다. http package는 HandleFunc를 mux.HandleFunc와 동일한 것을 제공한다.

 

위 코드를 다시 작성해보자!

 

package main

import (
	"fmt"
	"net/http"
)

func main() {
	http.HandleFunc("/", func(res http.ResponseWriter, req *http.Request) {
		fmt.Fprint(res, "Hello World!")
	})

	http.HandleFunc("/hello/golang", func(res http.ResponseWriter, req *http.Request) {
		fmt.Fprint(res, "Hello Golang")
	})

	http.ListenAndServe(":9000", nil)
}

 

바뀌기 전의 예제와 동일하게 작동한다. 

 

이번 예제에서는 ServeMux를 만들어서 들어오는 요청의 url에 맞춰서 응답을 하도록 만들었습니다. 

'golang > golang-webServer' 카테고리의 다른 글

go-grpc-gateway(2) go code 작성하기  (0) 2021.08.03
go-grpc-gateway(1) proto 작성해보기  (0) 2021.08.02
golang http server 시작하기  (0) 2020.04.16