Go
프로젝트 구조에 대한 우수 사례
수색…
GIN을 사용한 Restfull 프로젝트 API
Gin은 Golang으로 작성된 웹 프레임 워크입니다. 그것은 더 나은 성능, 최대 40 배 빠른 마티니와 같은 API를 특징으로합니다. 성능과 우수한 생산성이 필요한 경우 Gin을 좋아할 것입니다.
8 패키지 + main.go있을 것입니다
- 컨트롤러
- 핵심
- libs
- 미들웨어
- 공공의
- 라우터
- 서비스
- 검사들
- main.go
컨트롤러
컨트롤러 패키지는 모든 API 로직을 저장합니다. API가 무엇이든간에 여기에서 논리가 발생합니다.핵심
코어 패키지는 생성 된 모든 모델, ORM 등을 저장합니다.libs
이 패키지는 프로젝트에서 사용 된 모든 라이브러리를 저장합니다. 그러나 수동으로 생성 / 가져온 라이브러리의 경우에만 사용할 수 있으며go get package_name 명령을 사용할 때는 사용할 수 없습니다. 자신의 해싱 알고리즘, 그래프, 트리 등이 될 수 있습니다. 미들웨어
이 패키지는 프로젝트에 사용 된 모든 미들웨어를 저장하고, cors, device-id, auth 등의 생성 / 검증이 가능합니다.공공의
이 pacakge는 모든 공개 및 정적 파일을 저장하고 HTML, CSS, 자바 스크립트, 이미지 등이 될 수 있습니다.라우터
이 패키지는 REST API의 모든 경로를 저장합니다.샘플 코드에서 라우트를 할당하는 방법을 참조하십시오.
auth_r.go
import (
auth "simple-api/controllers/v1/auth"
"gopkg.in/gin-gonic/gin.v1"
)
func SetAuthRoutes(router *gin.RouterGroup) {
/**
* @api {post} /v1/auth/login Login
* @apiGroup Users
* @apiHeader {application/json} Content-Type Accept application/json
* @apiParam {String} username User username
* @apiParam {String} password User Password
* @apiParamExample {json} Input
* {
* "username": "your username",
* "password" : "your password"
* }
* @apiSuccess {Object} authenticate Response
* @apiSuccess {Boolean} authenticate.success Status
* @apiSuccess {Integer} authenticate.statuscode Status Code
* @apiSuccess {String} authenticate.message Authenticate Message
* @apiSuccess {String} authenticate.token Your JSON Token
* @apiSuccessExample {json} Success
* {
* "authenticate": {
* "statuscode": 200,
* "success": true,
* "message": "Login Successfully",
* "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ"
* }
* }
* @apiErrorExample {json} List error
* HTTP/1.1 500 Internal Server Error
*/
router.POST("/auth/login" , auth.Login)
}
보시다시피, 내가 핸들러를 분리하는 이유는 우리가 각 라우터를 쉽게 관리 할 수 있기 때문입니다. 그래서 API에 대한 주석을 만들 수 있습니다. apidoc을 사용하면이를 구조화 된 문서로 생성합니다. 그런 다음 현재 패키지에서 index.go의 함수를 호출합니다.
index.go
package v1
import (
"gopkg.in/gin-gonic/gin.v1"
token "simple-api/middlewares/token"
appid "simple-api/middlewares/appid"
)
func InitRoutes(g *gin.RouterGroup) {
g.Use(appid.AppIDMiddleWare())
SetHelloRoutes(g)
SetAuthRoutes(g) // SetAuthRoutes invoked
g.Use(token.TokenAuthMiddleWare()) //secure the API From this line to bottom with JSON Auth
g.Use(appid.ValidateAppIDMiddleWare())
SetTaskRoutes(g)
SetUserRoutes(g)
}
서비스
이 패키지는 사용 된 서비스에서 프로젝트에 사용 된 모든 구성 및 설정을 저장하며 mongodb, redis, mysql, elasticsearch 등이 될 수 있습니다.main.go
API의 주요 입구. dev 환경 설정, 시스템, 포트 등에 관한 설정은 여기서 설정합니다. 예:
main.go
package main
import (
"fmt"
"net/http"
"gopkg.in/gin-gonic/gin.v1"
"articles/services/mysql"
"articles/routers/v1"
"articles/core/models"
)
var router *gin.Engine;
func init() {
mysql.CheckDB()
router = gin.New();
router.NoRoute(noRouteHandler())
version1:=router.Group("/v1")
v1.InitRoutes(version1)
}
func main() {
fmt.Println("Server Running on Port: ", 9090)
http.ListenAndServe(":9090",router)
}
func noRouteHandler() gin.HandlerFunc{
return func(c *gin.Context) {
var statuscode int
var message string = "Not Found"
var data interface{} = nil
var listError [] models.ErrorModel = nil
var endpoint string = c.Request.URL.String()
var method string = c.Request.Method
var tempEr models.ErrorModel
tempEr.ErrorCode = 4041
tempEr.Hints = "Not Found !! \n Routes In Valid. You enter on invalid Page/Endpoint"
tempEr.Info = "visit http://localhost:9090/v1/docs to see the available routes"
listError = append(listError,tempEr)
statuscode = 404
responseModel := &models.ResponseModel{
statuscode,
message,
data,
listError,
endpoint,
method,
}
var content gin.H = responseModel.NewResponse();
c.JSON(statuscode,content)
}
}
ps :이 예제의 모든 코드는 다른 프로젝트에서 온 것입니다.
Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow







