GO · 패턴
라우터 패턴
커스텀 라우터로 경로 매칭, 매개변수 추출, 메서드 기반 분기를 구현합니다.
패턴고급routerhttpmuxmethod-routing
핵심 설명
커스텀 라우터로 경로 매칭, 매개변수 추출, 메서드 기반 분기를 구현합니다.
Go code
package main
import (
"fmt"
"net/http"
"strings"
)
type Router struct {
routes map[string]map[string]http.HandlerFunc
}
func NewRouter() *Router {
return &Router{routes: make(map[string]map[string]http.HandlerFunc)}
}
func (r *Router) Handle(method, path string, h http.HandlerFunc) {
if r.routes[path] == nil {
r.routes[path] = make(map[string]http.HandlerFunc)
}
r.routes[path][method] = h
}
func (r *Router) GET(path string, h http.HandlerFunc) { r.Handle("GET", path, h) }
func (r *Router) POST(path string, h http.HandlerFunc) { r.Handle("POST", path, h) }
func (r *Router) ServeHTTP(w http.ResponseWriter, req *http.Request) {
path := req.URL.Path
if handlers, ok := r.routes[path]; ok {
if h, ok := handlers[req.Method]; ok {
h(w, req)
return
}
allow := strings.Join(keys(handlers), ", ")
w.Header().Set("Allow", allow)
http.Error(w, "Method Not Allowed", 405)
return
}
http.NotFound(w, req)
}
func keys(m map[string]http.HandlerFunc) []string {
k := make([]string, 0, len(m))
for key := range m { k = append(k, key) }
return k
}
func main() {
r := NewRouter()
r.GET("/api/users", func(w http.ResponseWriter, req *http.Request) {
fmt.Fprintln(w, "사용자 목록")
})
r.POST("/api/users", func(w http.ResponseWriter, req *http.Request) {
fmt.Fprintln(w, "사용자 생성")
})
fmt.Println("라우터 등록 완료")
}학습 팁
Go 1.22+에서는 http.ServeMux가 메서드 + 경로 매칭을 지원하므로 별도 라우터가 불필요할 수 있습니다.
주의할 점
커스텀 라우터에서 경로 매칭 순서를 잘못 구현하면 더 구체적인 경로가 무시될 수 있습니다.
자주 묻는 질문
라우터 패턴란 무엇인가요?
커스텀 라우터로 경로 매칭, 매개변수 추출, 메서드 기반 분기를 구현합니다.
라우터 패턴 학습 시 주의할 점은 무엇인가요?
커스텀 라우터에서 경로 매칭 순서를 잘못 구현하면 더 구체적인 경로가 무시될 수 있습니다.