PHpullh
학습 라이브러리/Go/라우터 패턴

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가 메서드 + 경로 매칭을 지원하므로 별도 라우터가 불필요할 수 있습니다.

주의할 점

커스텀 라우터에서 경로 매칭 순서를 잘못 구현하면 더 구체적인 경로가 무시될 수 있습니다.

자주 묻는 질문

라우터 패턴란 무엇인가요?

커스텀 라우터로 경로 매칭, 매개변수 추출, 메서드 기반 분기를 구현합니다.

라우터 패턴 학습 시 주의할 점은 무엇인가요?

커스텀 라우터에서 경로 매칭 순서를 잘못 구현하면 더 구체적인 경로가 무시될 수 있습니다.