언어/go

go 언어의 Web framework인 gin을 사용하여 초간단 웹서버 만들기

Soyeon0111 2023. 3. 26. 23:42
반응형

📜 gin 이란?

go 언어로 작성된 Web Framework (go언어 web framework중 가장 유명하다.)

‘빠르고’ ‘경량화’ 된 것이 특징이다. 고성능 웹 어플리케이션을 개발할 수 있도록 지원한다.

더보기

Fast, 빠른 속도

Radix tree based routing, small memory foot print. No reflection. Predictable API performance.

기수 트리(Radix tree)를 기반으로 한 라우팅, 적은 메모리 사용량. 리플렉션 미사용. 예측 가능한 API 성능.

Middleware support, 미들웨어 지원

An incoming HTTP request can be handled by a chain of middlewares and the final action. For example: Logger, Authorization, GZIP and finally post a message in the DB.

수신된 HTTP 요청은 미들웨어 체인과 최종적인 액션을 통한 처리가 가능합니다. 예: Logger, 인증, GZIP 압축, DB에 메시지 전송.

Crash-free, 충돌 방지

Gin can catch a panic occurred during a HTTP request and recover it. This way, your server will be always available. As an example - it’s also possible to report this panic to Sentry!

Gin은 HTTP 요청 중 발생한 panic 을 감지하고 recover 할 수 있습니다. 따라서, 서버는 항상 이용 가능한 상태를 유지합니다. 예를 들면, 발생한 panic 을 Sentry에 보고 하는 것도 가능합니다!

JSON validation, JSON 유효성 검사

Gin can parse and validate the JSON of a request - for example, checking the existence of required values.

Gin은 JSON 형식의 요청에 대해 파싱과 유효성 검사를 할 수 있습니다. 예를 들어, 필수값이 들어 있는지 확인 할 수 있습니다.

Routes grouping, 라우팅 그룹화

Organize your routes better. Authorization required vs non required, different API versions… In addition, the groups can be nested unlimitedly without degrading performance.

라우팅 경로를 더 좋게 정리 할 수 있습니다. 인증이 필요한지 아닌지, 버전이 다른 API인지 아닌지 등… 또한, 성능 저하 없이 그룹을 무제한 중첩할 수 있습니다.

Error management, 에러 관리

Gin provides a convenient way to collect all the errors occurred during a HTTP request. Eventually, a middleware can write them to a log file, to a database and send them through the network.

Gin은 HTTP 요청 중에 발생한 모든 에러를 수집하는 편리한 방법을 제공합니다. 이것을 통해 미들웨어는 로그 파일, 데이터베이스에 기록하고 네트워크를 통해 전송할 수 있습니다.

Rendering built-in, 렌더링 기능 내장

Gin provides an easy to use API for JSON, XML and HTML rendering.

Gin은 JSON, XML, HTML 렌더링을 위한 사용하기 쉬운 API를 제공합니다.

Extendable, 확장 가능

Creating a new middleware is so easy, just check out the sample codes.

아주 쉽게 새로운 미들웨어를 만들 수 있습니다.

 

🏷 gin 외의 go의 web framework는 무엇이 있나요?

  • Echo: 경량화된 웹 프레임워크로 빠른 처리속도와 고성능이 특징
  • Fiber: 경량화된 웹 프레임워크로 fasthttp package를 사용하여 초고성능이 특징이다.
  • Beego: Full-stack 웹 프레임워크로 ORM, 인증, 세션관리 등 다양한 기능을 제공
  • Iris: 초고성능 HTTP/2 기반 웹 프레임워크로, 다양한 기능을 제공하며 높은 생산성과 안정성을 추구함
  • Fact: 유연하고 모듈화된 Go 웹 프레임워크로, HTTP 처리 및 미들웨어 등 다양한 기능을 지원함

 

👨‍💻 Let’s do it!

  • 목표 : go 언어의 web framework인 gin을 사용하여 초간단 API 서버를 만든다.

 

#1. GET /health

1. 프로젝트 생성하기

mkdir gin-project
cd gin-project

go mod init {module 이름}
go mod init lunit.soyeon/gin-project

go.mod 파일이 위와 같이 생성된다.

 

2. Gin Webframework 설치하기

  • gin webframework 를 아래 명령어를 통해 설치한다.
go get -u github.com/gin-gonic/gin

 

  • 실행 후에는
    • go.mod 에 require가 아래와 같이 추가된다.
    • go.sum 파일이 아래와 같이 생성되었다.

 

✍️ go.mod 파일? go.sum 파일?

  • go.mod 파일
    • go 언어의 모듈 시스템에서 사용하는 모듈 정의 파일
    • 프로젝트 의존성 관리를 편하게 할 수 있다.
    • module 이름 : 다른 프로젝트에서 해당 모듈을 가져다 사용할 때 필요한 정보
    • 의존하는 다른 module의 정보(require) : 해당 모듈을 빌드할 때 필요한 정보. go.mod 파일에 명시된 버전을 자동으로 다운로드 하여 사용한다.
  • go.sum 파일
    • go 언어의 모듈 시스템에서 사용하는 모듈 체크섬 파일
    • 모듈의 의존성을 다운로드 하고 사용할 때 해당 모듈의 버전과 체크섬 값을 검증하여 보안과 안정성을 유지함
    • 모듈 다운로드 시 해당 모듈의 버전과 체크섬 값을 검증하고 일치하지 않으면 다운로드를 중지한다.
    • go.sum 파일은 go.mod 파일과 함께 버전 관리 시스템에 저장되어야 하며, 프로젝트의 모듈 의존성 변경 시 체크섬 값이 변경되므로 go.sum 파일도 함께 업데이트되어야 한다.

 

 

3. main 함수 작성하기 : GET /health API

  • main.go 파일 생성
    • gin.Default()로 gin 웹 프레임워크에서 기본적으로 사용하는 gin 엔진 객체를 생성한다. 이 함수를 사용하여 기본적인 설정이 적용된 상태에서 Web application을 개발할 수 있다.
    • func(c *gin.Context)로 http 요청이 발생할 때 해당 요청을 처리 할 handler 함수를 호출한다. c 객체를 이용하여 HTTP 요청과 관련된 정보를 추출하거나, HTTP 응답을 생성하고, 다른 미들웨어나 핸들러 함수를 호출할 수 있다.
    • gin.H로 map 타입의 json 응답을 간편하게 생성한다. (shortcut for map[string]interface{} )
package main

import (
	"net/http"

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

func main() {
	// gin 엔진 생성(웹서버 생성)
	r := gin.Default()

	// GET /health API 핸들러 등록
	r.GET("/health", func(c *gin.Context) {
		// HTTP 상태 코드와 응답 메시지 설정
		c.JSON(http.StatusOK, gin.H{
			"version": "0.0.1",
		})
	})

	// 서버 시작
	r.Run(":8089")
}

 

 

4. 코드 실행하여 웹 서버 구동. API 동작 확인하기.

  • go run으로 웹 서버를 구동한다. ( go run은 테스트 시 많이 사용한다. )
go run main.go

  • GET /health 를 요청해본다.

 

 

#2. POST /user API 생성해보기

package main

import (
    "net/http"

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

// DB 대신에 user 정보를 저장할 구조체 슬라이스
type CreateUser struct {
    Id   int    `json:"id" binding:"required"`
    Name string `json:"name" binding:"required"`
}

var userList []CreateUser

func createUser(c *gin.Context) {
    input := CreateUser{}

    //shouldBind()를 통해 입력받은 JSON Body 데이터를 input에 저장한다.
    if err := c.ShouldBind(&input); err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{
            "status": err.Error(),
        })
        return
    }

    // input을 userList 슬라이스에 추가 해준다.
    userList = append(userList, input)
    c.JSON(http.StatusOK, gin.H{
        "status":      "ok",
        "input_data":  input,
        "result_data": userList,
    })
}
func main() {
    r := gin.Default()
    r.POST("/user", createUser)

    r.Run(":8089")
}

 

 

 

 

반응형