📜 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
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")
}
'언어 > go' 카테고리의 다른 글
[go] 왕초보 go언어 스터디 - 산술연산자(Arithmetic Operators)와 수학 처리 패키지 Math (0) | 2022.02.06 |
---|---|
[go] 왕초보 go언어 스터디 - 반복문 for와 break, continue (0) | 2022.02.06 |
[go] 왕초보 go언어 스터디 - 조건문 switch (0) | 2022.02.02 |
[go] 왕초보 go언어 스터디 - 조건문 if, else if, else (0) | 2022.01.03 |
[go] 왕초보 go언어 스터디 - 변수와 데이터형, 명시적 선언과 묵시적 선언 (0) | 2021.10.29 |