>백엔드 개발 >Golang >Go 라우팅: net/http를 사용하여 경로 처리 및 그룹화

Go 라우팅: net/http를 사용하여 경로 처리 및 그룹화

Barbara Streisand
Barbara Streisand원래의
2024-11-03 05:15:02814검색

Go Routing : Handling and Grouping Routes with net/http

Go 1.22에서는 net/http 패키지의 라우터에 메소드 일치와 와일드카드라는 두 가지 향상된 기능을 제공합니다. 이러한 기능을 사용하면 Go 코드 대신 일반적인 경로를 패턴으로 표현할 수 있습니다. 설명과 사용법은 간단하지만 요청에 여러 개가 일치할 때 승리 패턴을 선택하는 올바른 규칙을 생각해내는 것이 어려웠습니다.

Go 1.22는 net/http 패키지에 새로운 기능을 추가하여 타사 라이브러리를 사용하는 것에 대한 좋은 대안이 되었습니다. 이 기사에서는 Golang의 net/http 패키지를 사용하여 라우팅을 처리하는 방법을 살펴보겠습니다. 기본 경로 처리부터 시작하여 해당 경로를 그룹화하는 단계로 넘어갑니다.

메모

  • Go 버전 >= 1.22를 사용한다고 가정합니다
  • 자세한 내용은 저장소

기본 라우팅

경로 등록 방법부터 살펴보겠습니다.

// 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)
}

위의 코드를 살펴보겠습니다.

  1. router := http.NewServeMux() 이는 새로운 요청 멀티플렉서를 생성합니다. 요청이 이루어지면 라우터는 요청의 URL을 검사하고 요청을 처리하는 데 가장 적합한 핸들러를 선택합니다.
  2. router.HandleFunc("GET /users/", getUsers) 이는 /users/ 경로를 등록하고 이것이 GET 메소드 경로임을 나타냅니다.
  3. utils.WriteJSONResponse 이는 JSON 응답을 생성하는 유틸리티 함수이며 utils/utils.go의 저장소에서 찾을 수 있습니다.

참고: 요청 시 뒤에 슬래시를 추가하세요. 그렇지 않으면 404 찾을 수 없음 응답이 반환됩니다
예:

  • http://localhost:8000/users는 404를 반환합니다
  • http://localhost:8000/users/가 올바른 서버 응답을 반환합니다

샘플 요청:

  • 요청: GET http://localhost:8000/users/
  • 응답:
// 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
}
// ...

코드를 살펴보겠습니다.

  1. func NewHandler() *Handler 이는 존재하는 데이터베이스에 대한 액세스 추가와 같은 종속성 주입에 사용되는 새 핸들러를 생성합니다.
  2. func (h *Handler) RegisterRoutes() *http.ServeMux 여기서는 새로운 ServeMux를 생성하고 경로를 등록합니다.
// 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 메소드에 중점을 두고 설명하겠습니다.

  1. userHandler := user.NewHandler() 이는 새 핸들러를 생성하고 데이터베이스 연결과 같은 것들이 필요한 엔드포인트에 전달될 수 있는 지점입니다. 이를 종속성 주입이라고 합니다.
  2. userRouter := userHandler.RegisterRoutes() 이는 사용자 경로를 포함하는 ServeMux를 생성합니다.
  3. router.Handle("/api/v1/users/", http.StripPrefix("/api/v1/users", userRouter)) 이는 기본 URL /users/로 사용자를 등록합니다. StripPrefix는 userRouter로 라우팅하기 전에 요청 URL에서 지정된 접두사를 제거합니다.
// 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.