一応まだ作成中ではありますが、Go言語で(RESTっぽい)APIを書いて見る練習がしたかったので作ってみました。おそらくGo言語っぽさがありましたらPull Requestを頂ければ幸いです。
ファイル or 階層名 | 役割 |
---|---|
constants |
どこでも使うような定数値やenumのような形で使いたいものを格納する。 |
controllers |
エンドポイントからのリクエスト/レスポンスに関わるものを格納する。 |
database |
接続するデータベース(ORMの接続設定やMigraion関連)に関わるものを格納する。engine.go (ORMを利用するための処理) ・dbconf.yaml (マイグレーション実行用) ・migrations/ (マイグレーションファイル置き場) |
docs |
Swaggerで管理するドキュメントに関わるものを格納する。 |
entities |
接続しているテーブルのDBスキーマ定義と構造体を格納する。 |
factories |
APIレスポンス形式の雛形となる構造体を格納する。 |
middleware |
[機能作成中...]全体もしくは一部の処理で共通して必要な前後処理を割り込ませる。 |
repositories |
APIレスポンスを構築するためのロジックに関わるものを格納する。 |
static |
HTMLやCSS等の静的ファイルに関わるものを格納する。 |
tests |
ValidatorsやRepository等のテストコードを格納する。 |
validators |
エンドポイントからControllerに渡された値の妥当性検証に関わるものを格納する。 |
vendor |
インストールしたパッケージを格納する。 |
Gopkg.lock Gopkg.toml |
パッケージの依存関係を管理する。 |
main.go |
主にここではエンドポイントの管理を担当している。 |
大雑把な処理の流れは下記のような流れになります。
処理順1. controllerでリクエストを受け取ってvalidatorで妥当性を検証する。
処理順2. 1.が妥当であればcontrollerに対応するrepositoriesの処理(Interfaceを定義すること!)を実行する。
処理順3. 2.ではMySQLからentityで定義した形のデータを取得する等のロジックに関わる処理を行いfactoryで定義したデータを作成する。
処理順4. 3.の処理結果に応じてfactoryで定義した形のレスポンスを返却する。
下記のブログ記事を参考にそれぞれのディレクトリ構成を作成しました。
関係図:
参考:
現在は下記のGo言語のパッケージを用いて開発しています。 ロジックの構築に加えて運用保守に関わるもの等、便利そうなものは随時導入していく予定です。
1. API構築に関わるもの
パッケージ名 | 用途 |
---|---|
Gin | APIのルーティング管理 |
xorm | MySQLでのデータ取得用のORM 参考: GinでORM(xorm)を使ってみる |
bcrypt | パスワードのハッシュ化 参考: 【Go言語】パスワードをハッシュ化(bcrypt) |
2. 運用保守に関わるもの
パッケージ名 | 用途 |
---|---|
dep | パッケージの依存関係管理ツール |
goose | MySQLのDBマイグレーションツール |
swag gin-swagger gin-swagger/swaggerFiles go.uuid |
Ginを利用した構成でGodocからSwaggerによるAPI定義書の書き出し |
※ 以降は少なくともGo言語とMySQLがインストールされていることを前提としています。
1. パッケージの取得:
導入していないパッケージがある場合は下記のコマンドにて導入をしておく。
新規追加時:
$ dep ensure -add (パッケージ名)
更新時:
$ dep ensure -update (パッケージ名)
参考:
※ パッケージ管理ツールdep
を使用しない場合:
導入していないパッケージがある場合は下記のコマンドにて導入をしておく。
$ go get -u (パッケージ名)
※ コマンドラインツール(goose等)はローカル環境で実行する場合なんかは必要かもしれないです。
2. DB定義のマイグレーション:
DB構造の変更や追加がある際は下記のコマンドをGooseのREADME等を参考にし、実行するSQLを作成した後にマイグレーションを実行すること。
- イメージとしてはRailsの
rake db:migrate
と似たようなことをする。 -path "database"
としているのはdbconf.yaml
の場所がデフォルトと異なるため。
$ goose -path "database" (実行したい命令)
参考:
- Golang製DBマイグレーションツールgoose + MySQLを試してみた
- gooseによるテーブルマイグレーション管理
- golang製のDBマイグレーションツールgooseをMySQLで使ってみる
3. API定義書の自動書き出し:
APIの処理を新たに作成した場合にはコメントにAPI定義を記載しておく。 記載が終わったら下記のコマンドを実行し、API定義書を更新する。
参考:
$ swag init
$ go run main.go
起動ができたら下記のURLから、SwaggerUIと照らし合わせて、定義書と挙動が問題ないことを確認しておく。
4. その他気になったメモ集:
参考: 自分の環境で利用しているのはMySQL5.6系をローカルにインストールして利用しています。
参考: MySQLが起動できなかったので、再度$ brew ...
でMySQLをアンインストール→インストールを行なった際に下記の情報で解決はできた。
- mysqlが起動できない
- ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (38)
※ 開発環境であってもroot
ユーザーにパスワードにもパスワードを設定しておくと良いと思います。(本来はDockerにすべきなんだが...)