Golang의 Gin 및 MongoDB를 사용하여 CRUD API를 만드는 방법

Golang의 Gin 및 MongoDB를 사용하여 CRUD API를 만드는 방법

Golang은 많은 응용 프로그램이 있는 가장 많이 지불하는 주문형 프로그래밍 언어 중 하나입니다. Gin, Revel, gorilla/mux와 같은 프레임워크와 함께 사용하면 Go로 API를 쉽게 만들 수 있습니다.





Gin HTTP 프레임워크를 사용하여 Golang에서 CRUD API를 만드는 방법을 알아보세요.





MAKEUSEOF 오늘의 비디오

초기 설정 및 설치

Golang 시작하기 아직 설치하지 않았다면 컴퓨터에 설치하십시오.





설치가 완료되면 다음 단계는 컴퓨터에 프로젝트 루트 폴더를 만들고 해당 루트 디렉터리에서 Go 모듈을 초기화하는 것입니다.

이렇게 하려면 CLI , 프로젝트 루트 폴더로 이동하여 다음을 실행합니다.



go mod init module_name 

모듈 이름(예: CRUD_API ) 및 해당 버전을 열 때 go.mod 파일. 모든 사용자 정의 패키지는 이 상위 모듈에서 가져옵니다. 따라서 가져온 사용자 정의 패키지는 다음과 같은 형식을 취합니다.

import(package CRUD_API/package-directory-name)

다음으로 CRUD API 생성에 필요한 패키지를 설치합니다. 이 경우 사용 진 고닉 API 엔드포인트를 라우팅하려면:





go get github.com/gin-gonic/gin 

이제 데이터를 저장할 MongoDB 드라이버를 설치합니다.

go get go.mongodb.org/mongo-driver/mongo

Go를 MongoDB에 연결하는 방법

Golang을 데이터베이스와 연결하기 위한 MongoDB URI만 있으면 됩니다. MongoDB Atlas에 로컬로 연결하는 경우 일반적으로 다음과 같습니다.





Mongo_URL = "mongodb://127.0.0.1:27017"

이제 프로젝트 루트 디렉터리에 새 폴더를 만들고 호출합니다. 데이터베이스 . 이 폴더 안에 Go 파일을 만들고 이름을 지정하십시오. 데이터베이스.고 .

이것은 데이터베이스 패키지이며 필요한 라이브러리를 가져오는 것으로 시작합니다.

package database 

import (
"context"
"fmt"
"log"
"time"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)

func ConnectDB() *mongo.Client {
Mongo_URL := "mongodb://127.0.0.1:27017"
client, err := mongo.NewClient(options.Client().ApplyURI(Mongo_URL))

if err != nil {
log.Fatal(err)
}

ctx, cancel := context.WithTimeout(context.Background(), 10 * time.Second)
err = client.Connect(ctx)
defer cancel()

if err != nil {
log.Fatal(err)
}

fmt.Println("Connected to mongoDB")
return client
}

데이터베이스 연결 문자열과 같은 환경 변수를 숨기는 것이 가장 좋습니다. .env 파일 dotenv 패키지 사용 . 이렇게 하면 코드를 더 쉽게 이식할 수 있고 사용할 때 편리합니다. MongoDB 클라우드 클러스터 인스턴스 , 예를 들어.

컴퓨터 윈도우 10을 청소하는 방법

그만큼 커넥트DB 함수는 연결을 설정하고 새 MongoDB 클라이언트 객체를 반환합니다.

마이크로소프트 오피스를 가장 저렴하게 구입할 수 있는 곳

데이터베이스 컬렉션 생성

MongoDB는 기본 데이터베이스 데이터에 대한 인터페이스를 제공하는 컬렉션에 데이터를 저장합니다.

컬렉션 가져오기 기능을 처리하려면 먼저 새 폴더를 만들고, 수집 , 프로젝트 루트에 있습니다. 이제 새로운 Go 파일을 만들고, getCollection.go , 데이터베이스에서 컬렉션을 가져옵니다.

package getcollection 

import (
"go.mongodb.org/mongo-driver/mongo"
)

func GetCollection(client *mongo.Client, collectionName string) *mongo.Collection {
collection := client.Database("myGoappDB").Collection("Posts")
return collection
}

이 함수는 MongoDB 데이터베이스에서 컬렉션을 가져옵니다. 이 경우 데이터베이스 이름은 myGoappDB , 와 함께 게시물 컬렉션으로.

데이터베이스 모델 생성

루트 디렉토리 안에 새 폴더를 만들고 호출하십시오. 모델 . 이 폴더는 데이터베이스 모델을 처리합니다.

해당 폴더 안에 새 Go 파일을 만들고 호출하십시오. 모델.고 . 이 경우 모델은 제목이 다음과 같은 블로그 게시물입니다.

package model 

import (
"go.mongodb.org/mongo-driver/bson/primitive"
)

type Post struct {
ID primitive.ObjectID
Title string
Article string
}

Go로 CRUD API 만들기

다음은 CRUD API 생성입니다. 이 섹션부터 시작하려면 프로젝트 루트 디렉토리 내에 엔드포인트를 처리할 새 폴더를 만드십시오. 불러라 노선 .

각 작업에 대해 이 폴더에 별도의 Go 파일을 만듭니다. 예를 들어 이름을 지정할 수 있습니다. create.go , 읽기.고 , update.go , 그리고 삭제.고 . 이러한 핸들러를 노선 패키지.

Go에서 POST 끝점을 만드는 방법

데이터베이스에 데이터를 쓰기 위해 POST 끝점을 정의하여 시작합니다.

내부에 경로/create.go , 다음을 추가합니다.

package routes 

import (
getcollection "CRUD_API/Collection"
database "CRUD_API/databases"
model "CRUD_API/model"
"context"
"log"
"net/http"
"time"
"github.com/gin-gonic/gin"
"go.mongodb.org/mongo-driver/bson/primitive"
)

func CreatePost(c *gin.Context) {
var DB = database.ConnectDB()
var postCollection = getcollection.GetCollection(DB, "Posts")
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
post := new(model.Posts)
defer cancel()

if err := c.BindJSON(&post); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"message": err})
log.Fatal(err)
return
}

postPayload := model.Posts{
Id: primitive.NewObjectID(),
Title: post.Title,
Article: post.Article,
}

result, err := postCollection.InsertOne(ctx, postPayload)

if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"message": err})
return
}

c.JSON(http.StatusCreated, gin.H{"message": "Posted successfully", "Data": map[string]interface{}{"data": result}})
}

이 코드는 프로젝트의 사용자 정의 모듈을 가져오는 것으로 시작합니다. 그런 다음 다음을 포함한 타사 패키지를 가져옵니다. 그리고 몽고DB 드라이버 .

더 나아가, 포스트 컬렉션 데이터베이스 컬렉션을 보유합니다. 특히, c.BindJSON('게시물') 각 모델 필드를 다음과 같이 호출하는 JSON화된 모델 인스턴스입니다. 포스트페이로드 ; 이것은 데이터베이스에 들어갑니다.

GET 끝점을 만드는 방법

GET 끝점, 경로/read.go , 고유 ID를 통해 데이터베이스에서 단일 문서를 읽습니다. 또한 사용자 지정 및 타사 패키지를 가져오는 것으로 시작합니다.

package routes 

import (
getcollection "CRUD_API/Collection"
database "CRUD_API/databases"
model "CRUD_API/model"
"context"
"net/http"
"time"
"github.com/gin-gonic/gin"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
)

func ReadOnePost(c *gin.Context) {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
var DB = database.ConnectDB()
var postCollection = getcollection.GetCollection(DB, "Posts")

postId := c.Param("postId")
var result model.Posts

defer cancel()

objId, _ := primitive.ObjectIDFromHex(postId)

err := postCollection.FindOne(ctx, bson.M{"id": objId}).Decode(&result)

res := map[string]interface{}{"data": result}

if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"message": err})
return
}

c.JSON(http.StatusCreated, gin.H{"message": "success!", "Data": res})
}

그만큼 게시물 변수는 매개변수 선언입니다. 문서의 개체 ID를 다음과 같이 가져옵니다. 개체 ID .

하지만, 결과 나중에 반환된 문서를 다음과 같이 보관하는 데이터베이스 모델의 인스턴스입니다. 입술 .

PUT 끝점을 만드는 방법

PUT 핸들러, 경로/update.go , POST 핸들러와 유사합니다. 이번에는 고유한 개체 ID로 기존 게시물을 업데이트합니다.

package routes 

import (
getcollection "CRUD_API/Collection"
database "CRUD_API/databases"
model "CRUD_API/model"
"context"
"net/http"
"time"
"github.com/gin-gonic/gin"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
)

func UpdatePost(c *gin.Context) {
ctx, cancel := context.WithTimeout(context.Background(), 10 * time.Second)
var DB = database.ConnectDB()
var postCollection = getcollection.GetCollection(DB, "Posts")

postId := c.Param("postId")
var post model.Posts

defer cancel()

objId, _ := primitive.ObjectIDFromHex(postId)

if err := c.BindJSON(&post); err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"message": err})
return
}

edited := bson.M{"title": post.Title, "article": post.Article}

result, err := postCollection.UpdateOne(ctx, bson.M{"id": objId}, bson.M{"$set": edited})

res := map[string]interface{}{"data": result}

if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"message": err})
return
}

if result.MatchedCount < 1 {
c.JSON(http.StatusInternalServerError, gin.H{"message": "Data doesn't exist"})
return
}

c.JSON(http.StatusCreated, gin.H{"message": "data updated successfully!", "Data": res})
}

모델 인스턴스의 JSON 형식( 게시하다 ) 데이터베이스에서 각 모델 필드를 호출합니다. 결과 변수는 MongoDB를 사용합니다. $세트 객체 ID로 호출되는 필수 문서를 업데이트하는 연산자.

그만큼 result.MatchedCount 조건은 데이터베이스에 레코드가 없거나 전달된 ID가 유효하지 않은 경우 코드가 실행되지 않도록 합니다.

DELETE 끝점 만들기

DELETE 끝점, 삭제.고 , URL 매개변수로 전달된 객체 ID를 기반으로 문서를 제거합니다.

package routes 

import (
getcollection "CRUD_API/Collection"
database "CRUD_API/databases"
"context"
"net/http"
"time"
"github.com/gin-gonic/gin"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
)

func DeletePost(c *gin.Context) {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
var DB = database.ConnectDB()
postId := c.Param("postId")

var postCollection = getcollection.GetCollection(DB, "Posts")
defer cancel()
objId, _ := primitive.ObjectIDFromHex(postId)
result, err := postCollection.DeleteOne(ctx, bson.M{"id": objId})
res := map[string]interface{}{"data": result}

if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"message": err})
return
}

if result.DeletedCount < 1 {
c.JSON(http.StatusInternalServerError, gin.H{"message": "No data to delete"})
return
}

c.JSON(http.StatusCreated, gin.H{"message": "Article deleted successfully", "Data": res})
}

이 코드는 다음을 사용하여 레코드를 삭제합니다. 삭제원 기능. 그것은 또한 사용 result.DeletedCount 데이터베이스가 비어 있거나 개체 ID가 잘못된 경우 코드가 실행되지 않도록 하는 속성입니다.

API 러너 파일 생성

마지막으로 생성 메인.고 프로젝트 루트 디렉토리 내부. 최종 프로젝트 구조는 다음과 같아야 합니다.

  Golang CRUD 프로젝트 구조

이 파일은 각 끝점에 대한 라우터 실행을 처리합니다.

package main 

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

func main() {
router := gin.Default()

router.POST("/", routes.CreatePost)

// called as localhost:3000/getOne/{id}
router.GET("getOne/:postId", routes.ReadOnePost)

// called as localhost:3000/update/{id}
router.PUT("/update/:postId", routes.UpdatePost)

// called as localhost:3000/delete/{id}
router.DELETE("/delete/:postId", routes.DeletePost)

router.Run("localhost: 3000")
}

이 파일은 다른 파일을 실행하는 기본 패키지입니다. 경로 처리기를 가져오는 것으로 시작합니다. 다음은 라우터 변수, HTTP 작업을 호출하고 각 끝점을 함수 이름으로 호출하는 인스턴스 노선 패키지.

CRUD 프로젝트는 다음에서 실행됩니다. 로컬 호스트:3000 . 서버를 실행하고 CRUD API 테스트 , 기본 디렉터리에서 다음 명령을 실행합니다.

플래시 드라이브를 다시 포맷하는 방법
go run main.go

Golang CRUD 프로젝트를 사용 가능한 제품으로 전환

Go로 CRUD API를 성공적으로 만들었습니다. 축하합니다! 이것은 사소한 프로젝트이지만 Go에서 일반 HTTP 요청을 실행하는 데 필요한 사항을 보았습니다.

이를 사용자에게 가치를 전달하는 보다 실용적인 애플리케이션으로 확장하여 더 창의적으로 만들 수 있습니다. Go는 다양한 사용 사례에 적합한 프로그래밍 언어입니다.