더북(TheBook)

라우터에 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 인터페이스로 사용할 수 있다.

이제 routerServeHTTP 메서드를 만들어 보자. 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.Methodreq.URL.Path에 일치하는 핸들러를 찾아 수행한다. /users/:id이나 /users/:user_id/addresses/:address_id처럼 매개변수를 적용한 동적 URL 패턴에 핸들러를 연결하는 기능은 아직 구현하지 않았다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.