Skip to content

[ING] - GolangでのAPI作成のプラクティス用

Notifications You must be signed in to change notification settings

fumiyasac/SampleApiOfGo

Repository files navigation

GolangでのAPI作成のプラクティス用

一応まだ作成中ではありますが、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言語標準以外のパッケージ

現在は下記の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を作成した後にマイグレーションを実行すること。

  1. イメージとしてはRailsのrake db:migrateと似たようなことをする。
  2. -path "database"としているのはdbconf.yamlの場所がデフォルトと異なるため。
$ goose -path "database" (実行したい命令)

参考:

3. API定義書の自動書き出し:

APIの処理を新たに作成した場合にはコメントにAPI定義を記載しておく。 記載が終わったら下記のコマンドを実行し、API定義書を更新する。

参考:

$ swag init
$ go run main.go

起動ができたら下記のURLから、SwaggerUIと照らし合わせて、定義書と挙動が問題ないことを確認しておく。

4. その他気になったメモ集:

参考: 自分の環境で利用しているのはMySQL5.6系をローカルにインストールして利用しています。

参考: MySQLが起動できなかったので、再度$ brew ...でMySQLをアンインストール→インストールを行なった際に下記の情報で解決はできた。

※ 開発環境であってもrootユーザーにパスワードにもパスワードを設定しておくと良いと思います。(本来はDockerにすべきなんだが...)

About

[ING] - GolangでのAPI作成のプラクティス用

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published