라우터에 http.Handler 인터페이스의 ServeHTTP 메서드 정의
http.ListenAndServe(addr, handler) 함수의 두 번째 매개변수로 전달하는 http.Handler 인터페이스의 형태는 다음과 같다.
▼ http.Handler 인터페이스
type Handler interface { ServeHTTP(http.ResponseWriter, *http.Request) }
특정 타입에 ServeHTTP(http.ResponseWriter, *http.Request) 메서드를 추가하면 웹 요청을 받아서 처리하는 http.Handler 인터페이스로 사용할 수 있다.
이제 router에 ServeHTTP 메서드를 만들어 보자. ServeHTTP 메서드는 웹 요청의 http 메서드와 URL 경로를 분석해서 그에 맞는 핸들러를 찾아 동작시킨다. 만약 웹 요청에 일치하는 핸들러가 등록되어 있지 않으면 NotFound 에러를 반환한다.
▼ router.go
func (r *router) ServeHTTP(w http.ResponseWriter, req *http.Request) { if m, ok := r.handlers[req.Method]; ok { if h, ok := m[req.URL.Path]; ok { // 요청 URL에 해당하는 핸들러 수행 h(w, req) return } } http.NotFound(w, req) }
이 메서드에서는 라우터의 handlers에서 req.Method와 req.URL.Path에 일치하는 핸들러를 찾아 수행한다. /users/:id이나 /users/:user_id/addresses/:address_id처럼 매개변수를 적용한 동적 URL 패턴에 핸들러를 연결하는 기능은 아직 구현하지 않았다.