강력한 백엔드를 갖춘 동적 웹 애플리케이션을 만들고 싶으십니까? Go와 MongoDB만 있으면 됩니다! 이 강력한 조합을 사용하면 데이터 생성, 읽기, 업데이트 및 삭제(CRUD)를 쉽게 처리하는 확장 가능하고 효율적인 API를 구축할 수 있습니다.
초보자 친화적인 이 가이드에서는 Go와 MongoDB를 사용하여 간단한 CRUD API를 구축하는 과정을 살펴보겠습니다. 필수 단계를 다루고, 코드 예제를 제공하며, 그 과정에서 유용한 팁을 뿌릴 것입니다.
먼저 환경을 설정해 보겠습니다.
프로젝트 구조:
새 프로젝트 디렉토리를 만들고 다음과 같이 파일을 정리하세요.
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"` }
설명:
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 }
설명:
이제 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) }
설명:
마지막으로 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)) }
설명:
Postman 또는 컬과 같은 도구를 사용하여 API를 테스트할 수 있습니다.
축하합니다! Go 및 MongoDB를 사용하여 기본 CRUD API를 성공적으로 구축했습니다. 이러한 기반을 통해 API를 확장하여 보다 복잡한 기능을 처리하고 인상적인 웹 애플리케이션을 구축할 수 있습니다. Go와 MongoDB의 무한한 가능성을 계속해서 배우고 탐구하세요!
위 내용은 Go와 MongoDB: 처음부터 CRUD API 구축의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!