TECHSTEP

ITインフラ関連の記事を公開してます。

【個人メモ】Gin/Gormに入門してテスト用Webアプリを作成

はじめに

クラウドやコンテナに限らず、インフラ周りの検証をするとき、テスト用のアプリケーションを利用することが必要となってきました。今までは公式サイト等で用意しているテスト用アプリを利用することがほとんどでしたが、さすがにそれではいかんと思い、テスト用アプリを用意することにしました。

今回は、以前から少しずつ勉強していたGo言語を使い、ひとまず動くアプリを用意することができたので、簡単な説明を載せておきます。なお、今回のコードはこちらの記事で紹介しているコードをベースに、一部変更を加えたものになります。

学習目的として記録を残している面が強いので、その点はご了承ください。

アプリ

アプリケーションは簡単なToDo管理アプリになります。Tag Content TimeLimitの3つの値を入力し、ToDoのタイプ(Tag)、内容(Content)、期限(TimeLimit)を入力します。設定したToDoは内容の編集や削除も可能です。

実際のコードはGitHubの以下のリポジトリに配置しています。

github.com

プログラムを動かす環境から接続可能なPostgreSQLを用意し、Jsonファイルに接続情報を入力すれば動くはずです。

利用したフレームワーク

今回は簡単にWebアプリを用意したかったため、GinGormを利用しました。各フレームワークについては以下のドキュメントなどを参照してください。どちらも人気のフレームワークのため、インターネット上に多くの情報があり、思った以上に簡単に書くことができました。

※参考リンク:

今回はじめてGin/Gormを利用したため、個人的に気になった個所についてメモしておきます。

gorm.Model

データベースのテーブル設計はgorm.AutoMigrateによる自動マイグレーション機能を利用します。自動マイグレーションにより、アプリ実行時にテーブルが存在しない場合、指定した構造体に基づいてテーブルを作成するようにしています(カラムが不足している場合は追加することも可能ですが、カラムの削除はしてくれないようです)。テーブルの設計はTodo構造体で定義しており、その中にはgorm.Modelという項目があります。gorm.Modelを設定することで、テーブルにID CreatedAt UpdatedAt DeletedAtカラムが追加されます。

特に指定をしなければ、テーブルは構造体の複数形(ここではtodos)で作成されます。

// data struct
type Todo struct {
    gorm.Model
    Tag       string
    Content   string
    TimeLimit string
}

※参考リンク:

DBへの接続方法

main.goでデータベースにアクセスする際、当初は以下のように、毎回gorm.Openを実行し、引数に接続情報を設定していました。

func db_create(tag string, content string, timelimit string) {
        db, err := gorm.Open("postgres", "user=<user> password=<password> host=<db endpoint> port=<port> dbname=todo sslmode=disable")
        if err != nil {
                panic(err)
        }

        db.Create(&Todo{Tag: tag, Content: content, TimeLimit: timelimit})

        defer db.Close()
}

しかし、テスト用とはいえ、データベースを用意するたびに毎回複数箇所のコードを修正するため、最終的にはJsonファイルから情報を取ってきてデータベースにアクセスするdb_connect機能を用意し、これを呼び出してデータベースへアクセスするように変更しました。

※参考リンク:

json.Unmarshal

Jsonファイルをパースする際にjson.Unmarshalを利用しますが、この時に渡すデータ型が一瞬分からなくなったので、ここに残しておきます。困ったときは公式ドキュメントをまず読むようにしましょう。

func Unmarshal(data []byte, v interface{}) error

※参考リンク:

その他参考ドキュメント