진이 이해하려고 넷/http 만진 놈 1.

개시하다


나는 인터넷 회사에 들어온 지 반년이 넘었다.
3개월 전부터 배정된 진에 접촉하기 시작했지만, 업무가 비즈니스 논리의 실현을 중심으로 하기 때문에 근본적인 부분은 전혀 이해할 수 없었다.
기인이가 넷/http 래퍼로서 무엇을 하는지 저도 궁금하기 때문에 각자의 기능이 같은 서버를 적어서 비교하면서 이해해보려고 합니다.

컨디션


OS: Ubuntu 20.04.2 LTS (WSL2)
Go 1.16
Gin 1.7.4

제품

localhost:3000/public/hello의 GET 요청으로 간단한 json으로 돌아가는 API 서버를 설치하려고 시도했습니다.
이번 목적과는 다소 차이가 있지만 목록 구성은 이곳을 참고했다기본 배치.

Gin의 구현


보관소: https://github.com/imsugeno/gin
디렉토리 구조
.
├── README.md
├── cmd
│   └── main.go
├── go.mod
├── go.sum
└── internal
    └── handler
        ├── handler.go
        └── route_hello.go
main.go
package main

import (
	"github.com/imsugeno/gin/internal/handler"
)

func main() {
	r := handler.NewGinEngin()
	r.Run(":3000")
}
handler.go
package handler

import (
	"github.com/gin-gonic/gin"
)

func NewGinEngin() *gin.Engine {
	r := gin.Default()

	public := r.Group("/public")
	{
		bindRouteOfHello(public.Group("/hello"))
	}
	return r
}
route_hello.go
package handler

import (
	"net/http"

	"github.com/gin-gonic/gin"
)

func bindRouteOfHello(r *gin.RouterGroup) {
	r.GET("", func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{
			"message": "hello world",
		})
	})
}

net/http 설치


보관소: https://github.com/imsugeno/net-http
디렉토리 구조
.
├── README.md
├── cmd
│   └── main.go
├── go.mod
└── internal
    └── handler
        └── route_public.go
main.go
package main

import (
	"net/http"

	"github.com/imsugeno/net-http/internal/handler"
)

func main() {
	mux := http.NewServeMux()

	mux.HandleFunc("/public/hello", handler.Hello)
	http.ListenAndServe(":3000", mux)
}
route_public.go
package handler

import (
	"encoding/json"
	"net/http"
)

func Hello(w http.ResponseWriter, r *http.Request) {
	message := map[string]string{"message": "hello world"}
	jsonMessage, err := json.Marshal(message)
	if err != nil {
		panic(err.Error())
	}
	w.Write(jsonMessage)
}

다음 추궁점


나는 다음에 다시 깊이 파고들어 이번에 쏟아져 나오는 의문점을 쓰고 싶다.
  • Gin의 라우팅 그룹은 어떻게 이루어졌습니까?gin.RouterGroup에서 /public 이하의 루트를 정리했지만 구조를 잘 모르기 때문에 네트워크/http에서 실현할 수 없고 전체 경로/public/hello에서 처리 함수를 결합하여 설치할 수 밖에 없다.
  • 나는 이 부근이 진이 잘한 부분이라고 생각해서 향후 투고의 소재로 삼고 싶다.
  • Gin에서 요청 방법에 따라 라우팅하는 방법은 무엇입니까?
    처음에 GET로 json에게 답장을 요청했지만 위의net-http 창고의 실현은 HTTP 요청 방법에 따라 이루어지지 않았고 POST와 PUT200 OK는 모두 답장을 했다.
  • 이것gin.RouterGroup도 잘해서 루트의 화제로 이해한다.
  • gin.Context의 작업
    넷/http를 통해 처리 프로그램과 처리 프로그램 함수http.ResponseWriter*http.Request에 전달되는 구조체가 있다는 것을 알지만 그 외에 현장에서 보유하고 있는 queryCache는 무엇일까.

  • 말하자면gin.Engine은 무엇입니까?
    뭐?
  • 좋은 웹페이지 즐겨찾기