アーキテクチャについて
- clean archtecture like な設計を採用しまいた。。以下レポジトリを参考。 bxcodec/go-clean-arch
- 採用理由: 新規のプロダクトだったため、プロダクトの仕様が大きく変更されることが予想されました。そのため、こだわったというよりは、各Layerが多すぎず少なすぎないアーキテクチャがよいかなと思い、この設計にしました。
全体的な依存関係は以下です。
presentation (gqlgenで自動生成 )
↑
resolver (gqlgenで自動生成 )
↓
usecase interface
↑
usecase implement
↓
repository interface
↑
repository implement(ORMはsqlboiler で自動生成)
命名規則
- どのレイヤーでも以下のようなPrefixを推奨。作成意図としては、命名で迷う時間を減らすため。
- 配列を返すAPI
- 一覧: List
- 絞り込み ListByXXXX
- 単一レコード返すAPI
- Get
- GetByXXX
- レコードを作成する
- 単一レコードの作成: Create
- 他のレコードも同時に作成: CreateWithXXX
- レコードを更新する
- 単一レコードの更新: Update
- 他のレコードも同時に更新: UpdateWithXXX
関数に pointer を渡すかどうかについて
以下を参照。
Go言語(golang)における値渡しとポインタ渡しのパフォーマンス影響について
- 呼び出し元の値を変える必要があるなら、ポインタ
- 引数(レシーバ)が大きければ、ポインタ
- 引数(レシーバ)が小さければ、値
大きさについては、ぱっと検証することは不可能だと考え、渡した値に変更を加える場合はポインターを使い、変更を加えない場合は値渡しを使う方針
DB 制約のチェックリスト
- 中間テーブルの uniq 制約
- 外部キー制約 FOREIGN KEY, REFERENCES
データベースのモデリングについて
immutable data modeling を基本思想にする。 データの updateや deleteをすることはあまり推奨しない。
テストについて
テストは mockはなるべく使用せずに行う。
GraphqQL の リクエストレベルのテストと、repository層のテストを中心におこなう。
リレーションは pointer で定義する
つかっている gqlgen の性質上、pointer で定義しておいた方が使いやすいため
ログ設定について
- uber-go/zapを使用している
- 以下を参考に実施
graphql の schema について
- github の graphql を参考にする
- 参考書籍 https://github.com/vvakame/graphql-schema-guide
参考資料 / その他メモ
SQL Boiler 関連リンク
SQL boilersamplegqlgen-sqlboiler-examples
gqlgen関連 リンク
https://github.com/nutstick/gqlgen-clean-example
https://github.com/web-ridge/gqlgen-sqlboiler1回の Google ログインで、モバイルアプリ・自社サーバー・Google サービス・Firebase を連携させるフロー
sample of dataloderhttps://user-first.ikyu.co.jp/entry/go-graphql-dataloaderhttps://github.com/hatena/go-Intern-Bookmark
MF Kessai Go + gqlgen を使った GraphQL アプリケーションサーバーの実装
https://github.com/MichaelMure/git-bug