>백엔드 개발 >Golang >Go로 CRUD API 만들기

Go로 CRUD API 만들기

PHPz
PHPz원래의
2024-07-29 13:53:53925검색

Create a CRUD API with Go

CRUD 작업(생성, 읽기, 업데이트, 삭제)은 데이터베이스 작업 시 모든 웹 애플리케이션의 기본 기능입니다. 이 예에서는 Go를 사용하여 CRUD API를 생성하고 MySQL을 데이터베이스로 사용하는 방법을 보여줍니다.

전제조건

  • 1.21로 이동
  • MySQL

프로젝트 설정

Go 프로젝트 종속성을 설정합니다.

go mod init app
go get github.com/gin-gonic/gin
go get gorm.io/gorm
go get gorm.io/driver/mysql
go get github.com/joho/godotenv

"example"이라는 테스트용 데이터베이스를 생성하고 Database.sql 파일을 실행하여 테이블과 데이터를 가져옵니다.

프로젝트 구조

├─ .env
├─ main.go
├─ config
│  └─ db.go
├─ controllers
│  └─ product_controller.go
├─ models
│  └─ product.go
├─ public
│  └─ index.html
└─ router
   └─ router.go

프로젝트 파일

.env

이 파일에는 데이터베이스 연결 정보가 포함되어 있습니다.

DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=example
DB_USER=root
DB_PASSWORD=

db.go

이 파일은 GORM을 사용하여 데이터베이스 연결을 설정합니다. 나중에 애플리케이션에서 사용할 데이터베이스 연결 인스턴스를 보유하기 위해 전역 변수 DB를 선언합니다.

package config

import (
    "fmt"
    "os"

    "github.com/joho/godotenv"
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
    "gorm.io/gorm/schema"
)

var DB *gorm.DB

func SetupDatabase() {
    godotenv.Load()
    connection := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=true", os.Getenv("DB_USER"), os.Getenv("DB_PASSWORD"), os.Getenv("DB_HOST"), os.Getenv("DB_PORT"), os.Getenv("DB_DATABASE"))
    db, _ := gorm.Open(mysql.Open(connection), &gorm.Config{NamingStrategy: schema.NamingStrategy{SingularTable: true}})
    DB = db
}

router.go

이 파일은 Gin 웹 애플리케이션에 대한 라우팅을 설정합니다. 라우터를 초기화하고, 루트 URL에서 정적 index.html 파일을 제공하고, CRUD 작업을 위한 API 경로를 정의합니다.

package router

import (
    "app/controllers"

    "github.com/gin-gonic/gin"
)

func SetupRouter() {
    productController := controllers.ProductController{}
    router := gin.Default()
    router.StaticFile("/", "./public/index.html")
    router.Group("/api").
        GET("/products", productController.Index).
        POST("/products", productController.Create).
        GET("/products/:id", productController.Get).
        PUT("/products/:id", productController.Update).
        DELETE("/products/:id", productController.Delete)
    router.Run()
}

product.go

이 파일은 애플리케이션의 제품 모델을 정의합니다. 이 모델은 제품과 관련된 데이터베이스 작업에 사용됩니다.

package models

type Product struct {
    Id int `gorm:"primaryKey;autoIncrement"`
    Name string
    Price float64
}

product_controller.go

이 파일은 들어오는 요청을 처리하고 CRUD 작업을 수행하는 데 필요한 모든 기능을 정의합니다.

package controllers

import (
    "app/config"
    "app/models"
    "net/http"
    "strconv"

    "github.com/gin-gonic/gin"
)

type ProductController struct {
}

func (con *ProductController) Index(c *gin.Context) {
    var products []models.Product
    config.DB.Find(&products)
    c.JSON(http.StatusOK, products)
}

func (con *ProductController) Get(c *gin.Context) {
    var product models.Product
    config.DB.First(&product, c.Params.ByName("id"))
    c.JSON(http.StatusOK, product)
}

func (con *ProductController) Create(c *gin.Context) {
    var product models.Product
    c.BindJSON(&product)
    if err := config.DB.Create(&product).Error; err != nil {
        c.AbortWithError(http.StatusBadRequest, err)
        return
    }
    c.JSON(http.StatusOK, product)
}

func (con *ProductController) Update(c *gin.Context) {
    var product models.Product
    c.BindJSON(&product)
    product.Id, _ = strconv.Atoi(c.Params.ByName("id"))
    if err := config.DB.Updates(&product).Error; err != nil {
        c.AbortWithError(http.StatusBadRequest, err)
        return
    }
    c.JSON(http.StatusOK, product)
}

func (con *ProductController) Delete(c *gin.Context) {
    var product models.Product
    if err := config.DB.Delete(&product, c.Params.ByName("id")).Error; err != nil {
        c.AbortWithError(http.StatusBadRequest, err)
        return
    }
    c.Status(http.StatusOK)
}

c.BindJSON()은 요청 본문의 JSON 페이로드를 Go 구조체로 구문 분석합니다.

config.DB 원하는 데이터베이스 작업을 수행하는 데 사용되는 GORM 인스턴스입니다.

c.JSON()은 작업 결과와 적절한 HTTP 상태 코드가 포함된 JSON 응답을 보냅니다.

main.go

이 파일은 애플리케이션의 주요 진입점입니다. Gin 웹 애플리케이션을 생성하고 설정합니다.

package main

import (
    "app/config"
    "app/router"
)

func main() {
    config.SetupDatabase()
    router.SetupRouter()
}

index.html

이 파일은 API 테스트를 위한 기본 사용자 인터페이스를 만드는 데 사용됩니다.

<!DOCTYPE html>
<head>
    <style>
        li {
            margin-bottom: 5px;
        }
        textarea {
            width: 100%;
        }
    </style>
</head>
<body>
    <h1>Example CRUD</h1>
    <ul>
        <li><button onclick="getProducts()">Get Products</button></li>
        <li><button onclick="getProduct()">Get Product</button></li>
        <li><button onclick="createProduct()">Create Product</button></li>
        <li><button onclick="updateProduct()">Update Product</button></li>
        <li><button onclick="deleteProduct()">Delete Product</button></li>
    </ul>
    <textarea id="text_response" rows="20"></textarea>
    <script>
        function showResponse(res) {
            res.text().then(text => {
                let contentType = res.headers.get('content-type')
                if (contentType && contentType.startsWith('application/json')) {
                    text = JSON.stringify(JSON.parse(text), null, 4)
                }
                document.getElementById('text_response').innerHTML = text
            })
        }
        function getProducts() {
            fetch('/api/products').then(showResponse)
        }
        function getProduct() {
            let id = prompt('Input product id')
            fetch('/api/products/' + id).then(showResponse)
        }
        function createProduct() {
            let name = prompt('Input product name')
            let price = parseFloat(prompt('Input product price'))
            fetch('/api/products', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json'
                },
                body: JSON.stringify({ name, price })
            }).then(showResponse)
        }
        function updateProduct() {
            let id = parseInt(prompt('Input product id to update'))
            let name = prompt('Input new product name')
            let price = parseFloat(prompt('Input new product price'))
            fetch('/api/products/' + id, {
                method: 'PUT',
                headers: {
                    'Content-Type': 'application/json'
                },
                body: JSON.stringify({ name, price })
            }).then(showResponse)
        }
        function deleteProduct() {
            let id = prompt('Input product id to delete')
            fetch('/api/products/' + id, {
                method: 'DELETE'
            }).then(showResponse)
        }
    </script>
</body>
</html>
  • 다른 많은 기사에서는 Postman을 HTTP 클라이언트로 사용하여 API를 테스트하지만 이 기사에서는 대신 JavaScript를 사용하겠습니다. 이는 클라이언트 측에서 HTTP 요청 작업을 할 때 더 자세한 내용을 이해하는 데 도움이 됩니다.
  • 이 파일을 깔끔하고 읽기 쉽게 유지하기 위해 기본 HTML과 JavaScript만 사용합니다. 여기에는 CSS Framework 또는 Axios와 같은 추가 라이브러리가 없습니다.
  • 모든 CRUD 함수는 적절한 HTTP 메서드를 사용하여 API를 호출합니다.
  • showResponse(res)는 읽기 쉽도록 JSON 개체의 형식을 지정합니다.

프로젝트 실행

go run main.go

웹 브라우저를 열고 http://localhost:8080으로 이동하세요

테스트

모든 제품 받기

'제품 받기' 버튼을 클릭하세요. API는 모든 제품 데이터를 반환합니다.

Create a CRUD API with Go

ID로 제품 가져오기

'제품 가져오기' 버튼을 클릭하고 제품 ID에 '1'을 입력합니다. API는 제품 데이터를 반환합니다.

Create a CRUD API with Go

제품 생성

'제품 만들기' 버튼을 클릭하고 제품 이름에 'test-create', 가격에 '100'을 입력합니다. API는 새로 생성된 제품을 반환합니다.

Create a CRUD API with Go

제품 업데이트

'제품 업데이트' 버튼을 클릭하고 제품 ID에 '101', 이름에 'test-update', 가격에 '200'을 입력합니다. API는 업데이트된 제품을 반환합니다.

Create a CRUD API with Go

제품 삭제

'상품 삭제' 버튼을 클릭하고 상품 ID에 '101'을 입력하세요. API는 아무것도 반환하지 않습니다. 이는 API에서 아무것도 반환하지 않으므로 허용됩니다.

Create a CRUD API with Go

결론

이 기사에서는 CRUD API를 생성하기 위해 Gin 프레임워크를 생성하고 설정하는 방법을 배웠습니다. GORM을 ORM으로 활용하여 데이터베이스에서 CRUD 작업을 수행합니다. JavaScript를 사용하여 API를 테스트해 보세요. 기사를 재미있게 읽어보시기 바랍니다.

소스 코드: https://github.com/StackPuz/Example-CRUD-Go

CRUD 웹 앱 만들기: https://stackpuz.com

위 내용은 Go로 CRUD API 만들기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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