Go 및 QuestDB로 API를 구축하는 방법

QuestDB은 시계열 및 이벤트 데이터용으로 설계된 관계형 열 기반 데이터베이스입니다. 실시간 분석을 지원하기 위해 시계열용 확장 기능이 있는 SQL을 사용합니다.

QuestDB에 익숙하지 않은 경우 여기demo link로 문의하십시오.

이 자습서에서는 간단한 API를 빌드하고 프로젝트에서 시계열 데이터베이스로 QuestDB를 구현합니다. 그런 다음 HTTP 경로를 처리하기 위해 Gin Framework을 사용합니다.

시작하기 전에 다음과 같이 가정합니다.
  • 시스템에 Go가 설치되어 있음
  • Go 언어의 기본 이해
  • RESTful API에 대한 일반적인 이해가 있어야 합니다
  • .

    QuestDB 실행



    먼저 로컬에서 QuestDB를 실행해야 합니다. 설치 방법에는 여러 가지가 있습니다. here 에서 찾을 수 있습니다. 그러나 우리는 편의를 위해 Docker와 최신 questdb Docker 이미지를 사용할 것입니다.

    Docker를 통해 QuestDB를 시작하려면 다음을 실행합니다.

    docker run -p 9000:9000 \
      -p 9009:9009 \
      -p 8812:8812 \
      questdb/questdb
    


    또는 macOS 사용자는 Homebrew를 사용할 수 있습니다.

    brew install questdb
    brew services start questdb
    


    QuestDB를 시작한 후 웹 콘솔을 포트 9000에서 사용할 수 있으므로 localhost:9000로 이동하면 다음과 같은 UI가 표시됩니다.



    자, QuestDB가 준비되었습니다. 이제 다음 단계를 시작하겠습니다.

    Gin과 Gorm을 사용하여 Go에서 REST API 구축



    프로젝트의 종속성을 관리하기 위해 새로운 Go 모듈을 초기화하는 것부터 시작하겠습니다.

    go mod init
    


    이제 필요한 종속성을 설치하겠습니다.

    go get -u github.com/joho/godotenv
    go get -u gorm.io/gorm
    go get -u github.com/gin-gonic/gin
    


    설치가 완료되면 폴더에 go.modgo.sum 가 있어야 합니다. 두 파일 모두 우리가 설치한 패키지의 정보를 포함합니다.

    참고로 내 github에 전체 소스 코드를 게시했습니다. 자유롭게 복제하십시오.

    git clone https://github.com/arifintahu/go-api-questdb
    


    데이터베이스 설정



    데이터베이스 연결 및 모델을 생성하여 시작하겠습니다.

    // models/tracker.go
    
    package models
    
    import (
        "time"
    )
    
    type Tracker struct {
        Timestamp time.Time     `gorm:"type:timestamp" json:"timestamp"`
        VehicleId int           `gorm:"type:int" json:"vehicleId"`
        Latitude  float64       `gorm:"type:double" json:"latitude"`
        Longitude float64       `gorm:"type:double" json:"longitude"`
    }
    


    차량의 모든 위치를 기록하는 모델tracker이 있습니다. 각 트래커에는 타임스탬프, 정수 유형의 VehicleId, 부동 유형의 위도 및 경도가 있어야 합니다. 유형이 QuestDB 유형에서 사용 가능한지 여부를 고려해야 합니다here.

    다음으로 데이터베이스에 연결하기 위한 설정 함수를 생성합니다. Web Console, InfluxDB Line Protocol, PostgreSQL Wire Protocol, HTTP REST API와 같은 다양한network endpoints에 연결하여 QuestDB 데이터베이스와 상호 작용할 수 있습니다.

    우리는 golang에서 gorm을 ORM으로 사용할 수 있기 때문에 포트8812에 연결하여 PostgreSQL Wire Protocol을 사용할 것입니다. 그 전에 Postgres 드라이버를 사용하여 QuestDB를 연결하기 때문에 gorm 드라이버 postgres를 설치해야 합니다.

    go get -u gorm.io/driver/postgres
    


    그런 다음 데이터베이스 연결을 위한 함수를 작성합니다.

    // models/setup.go
    
    package models
    
    import (
        "fmt"
    
        "gorm.io/driver/postgres"
        "gorm.io/gorm"
    )
    
    var DB *gorm.DB
    
    type DBConfig struct {
        Host string
        User string
        Password string
        Name string
        Port string
    }
    
    func (dbConfig *DBConfig) ConnectDatabase() error {
        dsn := fmt.Sprintf(
            "host=%s user=%s password=%s dbname=%s port=%s",
            dbConfig.Host,
            dbConfig.User,
            dbConfig.Password,
            dbConfig.Name,
            dbConfig.Port,
        )
    
        database, err := gorm.Open(postgres.Open(dsn), &gorm.Config{})
    
        if err != nil {
            return err
        }
    
        database.AutoMigrate(&Tracker{})
    
        DB = database
    
        return nil
    }
    

    setup.go 에서 tracker 모델에 대한 자동 마이그레이션도 정의합니다. 따라서 먼저 데이터베이스에 테이블을 만들 필요가 없습니다.

    쓰기 컨트롤러



    다음으로 트래커를 만들고 찾을 수 있는 간단한 컨트롤러를 빌드합니다.

    // controllers/trackers.go
    
    package controllers
    
    import (
        "go-api-questdb/models"
        "net/http"
        "time"
    
        "github.com/gin-gonic/gin"
    )
    
    type CreateTrackerInput struct {
        VehicleId int    `json:"vehicleId"`
        Latitude  float64 `json:"latitude"`
        Longitude float64 `json:"longitude"`
    }
    
    func CreateTracker(c *gin.Context) {
        var input CreateTrackerInput
        if err:= c.ShouldBindJSON(&input); err != nil {
            c.JSON(http.StatusBadRequest, gin.H{"data": err.Error()})
            return
        }
    
        tracker := models.Tracker{
            Timestamp: time.Now().UTC(),
            VehicleId: input.VehicleId,
            Latitude: input.Latitude,
            Longitude: input.Longitude,
        }
    
        models.DB.Create(&tracker)
    
        c.JSON(http.StatusOK, gin.H{"data": tracker})
    }
    
    func GetTrackers(c *gin.Context) {
        var trackers []models.Tracker
        models.DB.Find(&trackers)
    
        c.JSON(http.StatusOK, gin.H{"data": trackers})
    }
    


    트래커 컨트롤러에는 CreateTrackerInput 핸들러에서 요청 본문의 유효성을 검사하기 위한 CreateTracker가 있습니다. 그런 다음 DB 인스턴스를 호출하여 행 생성을 실행합니다. 또한 모든 행을 가져오는 처리기GetTrackers가 있습니다.

    RESTful 경로



    거의 다 왔습니다!

    마지막으로 해야 할 일은 경로 처리기와 응용 프로그램 진입점을 만드는 것입니다.

    // main.go
    
    package main
    
    import (
        "go-api-questdb/controllers"
        "go-api-questdb/models"
        "os"
    
        "github.com/gin-gonic/gin"
        _ "github.com/joho/godotenv/autoload"
    )
    
    func main() {
        r := gin.Default()
    
        dbConfig := models.DBConfig{
            Host: os.Getenv("DB_HOST"),
            User: os.Getenv("DB_USER"),
            Password: os.Getenv("DB_PASSWORD"),
            Name: os.Getenv("DB_NAME"),
            Port: os.Getenv("DB_PORT"),
        }
        err := dbConfig.ConnectDatabase()
    
        if err != nil {
            panic(err)
        }
    
        r.POST("/trackers", controllers.CreateTracker)
        r.GET("/trackers", controllers.GetTrackers)
    
        r.Run("localhost:3000")
    }
    

    main.go에는 데이터베이스 연결을 초기화하기 위한 dbConfig가 있고 .env 파일에 데이터베이스 자격 증명을 로드합니다. 따라서 프로젝트에 .env 파일을 추가해야 합니다.

    명시된 대로 QuestDB의 기본 사용자 및 암호를 사용합니다here.

    // .env
    
    DB_HOST=localhost
    DB_USER=admin
    DB_PASSWORD=quest
    DB_NAME=qdb
    DB_PORT=8812
    


    좋아, API를 실행하자

    go run main.go
    



    좋습니다. 앱이 localhost:3000에서 성공적으로 실행되고 있으며 새 테이블을 성공적으로 마이그레이션하고 있습니다.
    POST 요청을 localhost:3000/trackers에 전송하여 테스트해 보겠습니다.

    curl --request POST 'localhost:3000/trackers' --header 'Content-Type: application/json' --data-raw '{ "vehicleId": 1, "latitude": -7.626923, "longitude": 111.5213978 }'
    


    그럼 우리는 얻었다

    {
        "data": {
            "timestamp": "2022-09-09T09:56:01.8970862Z",
            "vehicleId": 1,
            "latitude": -7.626923,
            "longitude": 111.5213978
        }
    }
    

    GET 요청을 localhost:3000/trackers에 전송하여 다시 테스트해 보겠습니다.

    {
        "data": [
            {
                "timestamp": "2022-09-09T09:56:01.8970862Z",
                "vehicleId": 1,
                "latitude": -7.626923,
                "longitude": 111.5213978
            }
        ]
    }
    


    네, Go 및 QuestDB로 API를 성공적으로 구축했습니다 🌟 🌟 🌟

    좋은 웹페이지 즐겨찾기