Go 1.22에서는 net/http 패키지의 라우터에 메소드 일치와 와일드카드라는 두 가지 향상된 기능을 제공합니다. 이러한 기능을 사용하면 Go 코드 대신 일반적인 경로를 패턴으로 표현할 수 있습니다. 설명과 사용법은 간단하지만 요청에 여러 개가 일치할 때 승리 패턴을 선택하는 올바른 규칙을 생각해내는 것이 어려웠습니다.
Go 1.22는 net/http 패키지에 새로운 기능을 추가하여 타사 라이브러리를 사용하는 것에 대한 좋은 대안이 되었습니다. 이 기사에서는 Golang의 net/http 패키지를 사용하여 라우팅을 처리하는 방법을 살펴보겠습니다. 기본 경로 처리부터 시작하여 해당 경로를 그룹화하는 단계로 넘어갑니다.
메모
경로 등록 방법부터 살펴보겠습니다.
// main.go package main import ( "log" "net/http" ) func main() { router := http.NewServeMux() router.HandleFunc("GET /users/", getUsers) router.HandleFunc("POST /users/", createUser) router.HandleFunc("GET /users/{id}/", getUser) router.HandleFunc("DELETE /users/{id}/", deleteUser) err := http.ListenAndServe(":8000", router) if err != nil { log.Fatal(err) } } // Here goes the implementation for getUsers, getUser, createUser, deleteUser // Check the repo in services/users/routes.go type User struct { ID int `json:"id"` Name string `json:"name"` Email string `json:"email"` } var users []User = []User{ {ID: 1, Name: "Bumblebee", Email: "bumblebee@autobots.com"}, {ID: 2, Name: "Optimus Prime", Email: "optimus.prime@autobots.com"}, {ID: 3, Name: "Ironhide", Email: "ironhide@autobots.com"}, {ID: 4, Name: "Hot Rod", Email: "hot.rod@autobots.com"}, } func getUsers(w http.ResponseWriter, r *http.Request) { response := map[string]any{ "message": "Done", "users": users, } utils.WriteJSONResponse(w, http.StatusOK, response) }
위의 코드를 살펴보겠습니다.
참고: 요청 시 뒤에 슬래시를 추가하세요. 그렇지 않으면 404 찾을 수 없음 응답이 반환됩니다
예:
샘플 요청:
// statusCode: 200 { "message": "Done", "users": [ { "id": 1, "name": "Bumblebee", "email": "bumblebee@autobots.com" }, { "id": 2, "name": "Optimus Prime", "email": "optimus.prime@autobots.com" }, { "id": 3, "name": "Ironhide", "email": "ironhide@autobots.com" }, { "id": 4, "name": "Hot Rod", "email": "hot.rod@autobots.com" } ] }
위에서 볼 수 있듯이 이렇게 하려면 모든 엔드포인트를 같은 장소에 등록해야 하며 신속하게 처리할 수 없게 됩니다. 경로를 그룹화하면 관련 경로와 논리를 함께 배치하여 코드를 정리하고 확장 가능하며 유지 관리할 수 있게 유지하는 데 도움이 됩니다. 이를 통해 미들웨어를 선택적으로 적용할 수 있고, 재사용성을 장려하며, 특히 애플리케이션이 성장함에 따라 가독성이 향상됩니다.
이제 경로를 그룹화하는 방법을 살펴보겠습니다
핸들러 기능이 정의된 패키지에 로컬로 경로를 등록하는 것부터 시작하겠습니다. 다음 단계는 다양한 경로를 모두 모아 서버를 시작하는 것입니다.
// services/users/routes.go package user import ( "fmt" "net/http" "strconv" "<your-project-name>/gorouting/utils" ) type Handler struct{} func NewHandler() *Handler { return &Handler{} } func (h *Handler) RegisterRoutes() *http.ServeMux { r := http.NewServeMux() r.HandleFunc("GET /", getUsers) r.HandleFunc("POST /", createUser) r.HandleFunc("GET /{id}/", getUser) r.HandleFunc("DELETE /{id}/", deleteUser) return r } // ...
코드를 살펴보겠습니다.
// main.go package main import ( "log" "net/http" ) func main() { router := http.NewServeMux() router.HandleFunc("GET /users/", getUsers) router.HandleFunc("POST /users/", createUser) router.HandleFunc("GET /users/{id}/", getUser) router.HandleFunc("DELETE /users/{id}/", deleteUser) err := http.ListenAndServe(":8000", router) if err != nil { log.Fatal(err) } } // Here goes the implementation for getUsers, getUser, createUser, deleteUser // Check the repo in services/users/routes.go type User struct { ID int `json:"id"` Name string `json:"name"` Email string `json:"email"` } var users []User = []User{ {ID: 1, Name: "Bumblebee", Email: "bumblebee@autobots.com"}, {ID: 2, Name: "Optimus Prime", Email: "optimus.prime@autobots.com"}, {ID: 3, Name: "Ironhide", Email: "ironhide@autobots.com"}, {ID: 4, Name: "Hot Rod", Email: "hot.rod@autobots.com"}, } func getUsers(w http.ResponseWriter, r *http.Request) { response := map[string]any{ "message": "Done", "users": users, } utils.WriteJSONResponse(w, http.StatusOK, response) }
여기에서는 Run 메소드에 중점을 두고 설명하겠습니다.
// statusCode: 200 { "message": "Done", "users": [ { "id": 1, "name": "Bumblebee", "email": "bumblebee@autobots.com" }, { "id": 2, "name": "Optimus Prime", "email": "optimus.prime@autobots.com" }, { "id": 3, "name": "Ironhide", "email": "ironhide@autobots.com" }, { "id": 4, "name": "Hot Rod", "email": "hot.rod@autobots.com" } ] }
“Go 1.22를 통해 net/http는 이제 더욱 다양해졌으며 명확성과 효율성을 향상시키는 경로 패턴을 제공합니다. 경로를 그룹화하는 이러한 접근 방식은 Go에 내장된 라우팅 기능을 활용하면서 확장 가능한 코드를 유지하는 것이 얼마나 쉬운지 보여줍니다." 채팅GPT
이제 사용자 경로를 그룹화했습니다. 저장소를 복제하고 다른 서비스를 추가해 보세요.
위 내용은 Go 라우팅: net/http를 사용하여 경로 처리 및 그룹화의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!