Go + Gin + GormでREST APIを実装してGAEにデプロイする

Go + Gin + GormでREST APIをさくっと実装してGAEにデプロイしてみました。

そもそもGoの本やGoに関する情報を読んだ感じ、多くのことが標準ライブラリでまかなえるため、基本はFWやORMを使わないのが「Goらしい手法」とのことなので、次は標準ライブラリのみでも実装してみたいと思います。

参考:https://employment.en-japan.com/engineerhub/entry/2018/06/19/110000

参考:https://golang.org/doc/effective_go.html

Ginとは

Ginとは軽量かつシンプルなインターフェイスが特徴のGoのWebアプリケーションフレームワークです。

また、GoのWebアプリケーションの中では比較的初期から開発されているので安定して使われています。

Gormとは

Goでよく使われているORMの一種です。

そもそもORM(O/Rマッピング)とは、オブジェクト指向言語におけるオブジェクトと、リレーショナルデータベースにおけるレコードとを対応づけることです。

ORMによって、リレーショナルデータベースのレコードがオブジェクトとして直感的に扱えるようになり、リレーショナルデータベースにアクセスするプログラムを記述する処理を容易にすることが可能になります。

プロジェクト構成

Getパラメータで本検索をして、その結果をJSON形式で返す簡単なAPIを実装していきます。

以下の記事を参考にプロジェクト構成を組んでみました。元々Railsを書いていたこともあり、この構成が今のところしっくりきました(今後勉強していくうちによりより構成が見つかる気がします)。

参考:https://qiita.com/Asuforce/items/0bde8cabb30ac094fcb4

sample-go-api
├── controller
│ └──book_controller.go
├── db
│ └── db.go
├── entity
│ └── book.go
├── main.go
├── server
│ └── server.go
├── service
│ └── book_service.go
├── .env.development
├── .env.production
├── .gcloudignore
├── .gitgnore
├── app.yaml
├── docker-compose.yml
├── go.mod
├── go.sum
├── main.go

DB・モデル実装

ローカル用にDockerでさくっとMySQLを立ち上げてDBを作成します。

・docker-compose.yml

 

docker-compose.ymlができたら、起動します。

 

次にGormとMySQLをgo getでインストールします。

 

本モデルを作成します。

booksテーブルのカラムを定義します。

・entity/book.go

 

DB周りを実装していきます。今回はGAEに本番環境をデプロイするので、developmentとproductionと2つの環境を作りました。そのため、godotenvライブラリを使って実行する環境を取得します。

実行環境に合ったDB接続を行います。ローカルはDockerで立ち上げたMySQL、本番はCloud SQLを使っています。

DB初回起動時にマイグレーションが行われるようにしています。

・db/db.go

 

ローカル環境用のenv。

・.env.development

 

本番環境用のenv。

・.env.production

 

Bookサービスの実装

検索処理を実装していきます。送られてきたGETパラメータからそれぞれのカラム検索を行います。

Gormを使っていますが、このくらいのSQLならわざわざORMを使わなくても良い気がしますね。

・service/book_service.go

 

Bookコントローラの実装

Ginをgo getでインストールしておきます。

 

コントローラを実装します。*gin.ContextでGETパラメータを取得してサービスの検索メソッドに投げています。

検索結果を受け取ってJSON形式で返しています。

・controller/book_controller.go

 

サーバ周り実装

ルーティング・CORS設定・サーバ起動を実装しています。

・server/server.go

 

main.goの実装

最後にmain.goからDBとサーバを起動して完了です。後は.gitignoreにenvファイルを追加しておきましょう。

 

GAEにデプロイする

完成したAPIをGAEにデプロイします。

Goのバージョンは1.12、インスタンスクラスは一番下のF1を指定します(デフォルトF1ですが)。

正規表現 /.* にパスが一致するURLへのすべてのリクエストはmainパッケージのhandle関数で処理されます。

ENVでproductionを指定することでCloud SQLに接続するようにしています。

参考:https://cloud.google.com/appengine/docs/standard/go/config/appref?hl=ja

 

以下のコマンドでGAEにデプロイして完了です。