더북(TheBook)

매개변수가 적용된 동적 URL 패턴도 라우팅할 수 있게 ServeHTTP 메서드를 수정해 보자. 라우터에 등록된 동적 URL 패턴과 실제 URL 경로가 일치하는지 확인하는 match 함수를 만들고, 라우터의 ServeHTTP 메서드에서 match 함수를 사용하게 한다.

▼ router.go

func match(pattern, path string) (bool, map[string]string) {
    // 패턴과 패스가 정확히 일치하면 바로 true를 반환
    if pattern == path {
        return true, nil
    }
 
// 패턴과 패스를 “/” 단위로 구분 patterns := strings.Split(pattern, ”/”) paths := strings.Split(path, ”/”)
// 패턴과 패스를 “/“로 구분한 후 부분 문자열 집합의 개수가 다르면 false를 반환 if len(patterns) != len(paths) { return false, nil }
// 패턴에 일치하는 URL 매개변수를 담기 위한 params 맵 생성 params := make(map[string]string)
// “/“로 구분된 패턴/패스의 각 문자열을 하나씩 비교 for i := 0; i < len(patterns); i++ { switch { case patterns[i] == paths[i]: // 패턴과 패스의 부분 문자열이 일치하면 바로 다음 루프 수행 case len(patterns[i]) > 0 && patterns[i][0] == ‘:’: // 패턴이 ‘:’ 문자로 시작하면 params에 URL params를 담은 후 다음 루프 수행 params[patterns[i][1:]] = paths[i] default: // 일치하는 경우가 없으면 false를 반환 return false, nil } }
// true와 params를 반환 return true, params } func (r *router) ServeHTTP(w http.ResponseWriter, req *http.Request) { // http 메서드에 맞는 모든 handers를 반복하여 요청 URL에 해당하는 handler를 찾음 for pattern, handler := range r.handlers[req.Method] { if ok, _ := match(pattern, req.URL.Path); ok { // 요청 URL에 해당하는 handler 수행 handler(w, req) return } } // 요청 URL에 해당하는 handler를 찾지 못하면 NotFound 에러 처리 http.NotFound(w, req) return }

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