>  기사  >  백엔드 개발  >  Go와 MongoDB: 처음부터 CRUD API 구축

Go와 MongoDB: 처음부터 CRUD API 구축

王林
王林원래의
2024-07-18 08:55:05833검색

Go and MongoDB: Building a CRUD API from Scratch

강력한 백엔드를 갖춘 동적 웹 애플리케이션을 만들고 싶으십니까? Go와 MongoDB만 있으면 됩니다! 이 강력한 조합을 사용하면 데이터 생성, 읽기, 업데이트 및 삭제(CRUD)를 쉽게 처리하는 확장 가능하고 효율적인 API를 구축할 수 있습니다.

초보자 친화적인 이 가이드에서는 Go와 MongoDB를 사용하여 간단한 CRUD API를 구축하는 과정을 살펴보겠습니다. 필수 단계를 다루고, 코드 예제를 제공하며, 그 과정에서 유용한 팁을 뿌릴 것입니다.

시작하기

먼저 환경을 설정해 보겠습니다.

  1. Go 설치: https://go.dev/dl/에서 최신 버전의 Go를 다운로드하여 설치하세요.
  2. MongoDB 설정: MongoDB가 실행되고 있지 않은 경우 https://www.mongodb.com/try/download/community에서 다운로드하여 설치할 수 있습니다.
  3. IDE 또는 텍스트 편집기: 선호하는 코딩 환경을 선택하세요. 인기 있는 옵션으로는 VS Code, GoLand 또는 Atom이 있습니다.

프로젝트 구조:

새 프로젝트 디렉토리를 만들고 다음과 같이 파일을 정리하세요.

my-crud-api/
├── main.go
├── models/
│   └── user.go
├── handlers/
│   └── user.go
└── config/
    └── config.go

모델 정의

데이터 모델 정의부터 시작해 보겠습니다. 이 예에서는 간단한 User 구조체를 생성합니다:

// models/user.go
package models

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

type User struct {
    ID     primitive.ObjectID `bson:"_id,omitempty"`
    Name   string             `bson:"name,omitempty"`
    Email  string             `bson:"email,omitempty"`
    Age    int                `bson:"age,omitempty"`
    Active bool               `bson:"active,omitempty"`
}

설명:

  • mongo-driver 패키지의 기본.ObjectID를 사용하여 고유한 MongoDB 문서 ID를 나타냅니다.
  • bson 태그는 Go 구조체 필드를 MongoDB 문서의 해당 필드에 매핑하는 데 중요합니다.

몽고DB에 연결

MongoDB 데이터베이스에 대한 연결을 설정해야 합니다. config 디렉터리에 config.go 파일을 생성합니다:

// config/config.go
package config

import (
    "context"
    "fmt"
    "os"

    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
)

func ConnectToMongoDB() (*mongo.Client, error) {
    uri := os.Getenv("MONGODB_URI")
    if uri == "" {
        return nil, fmt.Errorf("MONGODB_URI is not set")
    }

    clientOptions := options.Client().ApplyURI(uri)
    client, err := mongo.Connect(context.Background(), clientOptions)
    if err != nil {
        return nil, err
    }

    err = client.Ping(context.Background(), nil)
    if err != nil {
        return nil, err
    }

    return client, nil
}

설명:

  • os.Getenv를 사용하여 환경 변수 MONGODB_URI에서 MongoDB 연결 URI를 검색합니다. 귀하의 환경에서 이 변수를 설정하십시오.
  • mongo-driver 패키지를 사용하여 MongoDB 데이터베이스에 연결하고 데이터베이스 핑과 같은 기본 작업을 수행합니다.

빌딩 핸들러

이제 CRUD 작업을 위한 API 핸들러를 구축해 보겠습니다. 핸들러 디렉터리에서 user.go 파일을 생성합니다:

// handlers/user.go
package handlers

import (
    "context"
    "encoding/json"
    "fmt"
    "net/http"

    "github.com/your-username/my-crud-api/config"
    "github.com/your-username/my-crud-api/models"
    "go.mongodb.org/mongo-driver/bson"
    "go.mongodb.org/mongo-driver/bson/primitive"
    "go.mongodb.org/mongo-driver/mongo"
)

// Create a new user
func CreateUser(w http.ResponseWriter, r *http.Request) {
    client, err := config.ConnectToMongoDB()
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    defer client.Disconnect(context.Background())

    var user models.User
    if err := json.NewDecoder(r.Body).Decode(&user); err != nil {
        http.Error(w, err.Error(), http.StatusBadRequest)
        return
    }

    collection := client.Database("your_database_name").Collection("users")
    result, err := collection.InsertOne(context.Background(), user)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    json.NewEncoder(w).Encode(result)
}

// Get all users
func GetAllUsers(w http.ResponseWriter, r *http.Request) {
    client, err := config.ConnectToMongoDB()
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    defer client.Disconnect(context.Background())

    collection := client.Database("your_database_name").Collection("users")
    cursor, err := collection.Find(context.Background(), bson.D{})
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    defer cursor.Close(context.Background())

    var users []models.User
    for cursor.Next(context.Background()) {
        var user models.User
        if err := cursor.Decode(&user); err != nil {
            http.Error(w, err.Error(), http.StatusInternalServerError)
            return
        }
        users = append(users, user)
    }

    json.NewEncoder(w).Encode(users)
}

// Get a user by ID
func GetUserByID(w http.ResponseWriter, r *http.Request) {
    client, err := config.ConnectToMongoDB()
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    defer client.Disconnect(context.Background())

    id, err := primitive.ObjectIDFromHex(r.URL.Query().Get("id"))
    if err != nil {
        http.Error(w, err.Error(), http.StatusBadRequest)
        return
    }

    collection := client.Database("your_database_name").Collection("users")
    var user models.User
    if err := collection.FindOne(context.Background(), bson.M{"_id": id}).Decode(&user); err != nil {
        http.Error(w, err.Error(), http.StatusNotFound)
        return
    }

    json.NewEncoder(w).Encode(user)
}

// Update a user
func UpdateUser(w http.ResponseWriter, r *http.Request) {
    client, err := config.ConnectToMongoDB()
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    defer client.Disconnect(context.Background())

    id, err := primitive.ObjectIDFromHex(r.URL.Query().Get("id"))
    if err != nil {
        http.Error(w, err.Error(), http.StatusBadRequest)
        return
    }

    var updatedUser models.User
    if err := json.NewDecoder(r.Body).Decode(&updatedUser); err != nil {
        http.Error(w, err.Error(), http.StatusBadRequest)
        return
    }

    collection := client.Database("your_database_name").Collection("users")
    filter := bson.M{"_id": id}
    update := bson.M{"$set": updatedUser}
    result, err := collection.UpdateOne(context.Background(), filter, update)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    json.NewEncoder(w).Encode(result)
}

// Delete a user
func DeleteUser(w http.ResponseWriter, r *http.Request) {
    client, err := config.ConnectToMongoDB()
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    defer client.Disconnect(context.Background())

    id, err := primitive.ObjectIDFromHex(r.URL.Query().Get("id"))
    if err != nil {
        http.Error(w, err.Error(), http.StatusBadRequest)
        return
    }

    collection := client.Database("your_database_name").Collection("users")
    result, err := collection.DeleteOne(context.Background(), bson.M{"_id": id})
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    json.NewEncoder(w).Encode(result)
}

설명:

  • CreateUser, GetAllUsers, GetUserByID, UpdateUser 및 DeleteUser와 같은 CRUD 작업을 구현합니다.
  • 각 함수는 MongoDB에 연결하고, 컬렉션을 검색하고, 해당 작업을 수행하고, JSON 응답을 반환합니다.
  • 잠재적인 오류를 처리하고 적절한 HTTP 상태 코드를 반환합니다.

메인 애플리케이션 설정

마지막으로 main.go 파일에 모든 것을 하나로 묶어 보겠습니다.

// main.go
package main

import (
    "fmt"
    "log"
    "net/http"

    "github.com/your-username/my-crud-api/handlers"
)

func main() {
    http.HandleFunc("/users", handlers.CreateUser)
    http.HandleFunc("/users", handlers.GetAllUsers)
    http.HandleFunc("/users/", handlers.GetUserByID)
    http.HandleFunc("/users/", handlers.UpdateUser)
    http.HandleFunc("/users/", handlers.DeleteUser)

    fmt.Println("Server running on port 8080")
    log.Fatal(http.ListenAndServe(":8080", nil))
}

설명:

  • 해당 HTTP 엔드포인트에 API 핸들러를 등록합니다.
  • 서버를 시작하고 포트 8080에서 수신합니다.

API 실행

  1. 환경 변수: MongoDB 연결 문자열을 사용하여 MONGODB_URI 환경 변수를 설정합니다.
  2. 빌드 및 실행: go build를 사용하여 Go 애플리케이션을 빌드한 후 ./my-crud-api를 사용하여 실행합니다.

API 테스트

Postman 또는 컬과 같은 도구를 사용하여 API를 테스트할 수 있습니다.

  • 생성: 사용자 세부정보가 포함된 JSON 페이로드를 사용하여 /users에 POST 요청을 보냅니다.
  • 읽기: 모든 사용자를 검색하려면 /users에 GET 요청을 보내고, 특정 사용자를 검색하려면 /users/?id={user_id}에 GET 요청을 보냅니다.
  • 업데이트: 업데이트된 사용자 세부 정보가 포함된 JSON 페이로드를 사용하여 /users/?id={user_id}에 PUT 요청을 보냅니다.
  • 삭제: 사용자를 삭제하려면 /users/?id={user_id}에 DELETE 요청을 보냅니다.

성공을 위한 팁

  • 오류 처리: 항상 잠재적인 오류를 처리하고 의미 있는 HTTP 상태 코드를 반환합니다.
  • 보안: API에 대한 적절한 인증 및 권한 부여 메커니즘을 구현하세요.
  • 데이터베이스 설계: 성능과 확장성을 최적화하려면 데이터베이스 스키마를 신중하게 설계하세요.
  • 문서화: API 엔드포인트, 요청/응답 형식, 오류 코드를 문서화하세요.

축하합니다! Go 및 MongoDB를 사용하여 기본 CRUD API를 성공적으로 구축했습니다. 이러한 기반을 통해 API를 확장하여 보다 복잡한 기능을 처리하고 인상적인 웹 애플리케이션을 구축할 수 있습니다. Go와 MongoDB의 무한한 가능성을 계속해서 배우고 탐구하세요!

위 내용은 Go와 MongoDB: 처음부터 CRUD API 구축의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.