はじめに
新卒専用 Advent Calendar 2017 16日目の記事です。
今年大学を卒業しエンジニアとしてIT企業に就職しました。
よろしくお願いします。
何したの
GoでAPIサーバー作成に取り組んでみた話です。
先日、開発環境用のMockサーバーを作る機会が降ってきました。
せっかくなので未経験の言語でやってみようとGoで組んでみました。
固定値を返せばいい要件だったので、そんなにかっちり組む必要はなかったのですが、
ちょうどフロントエンドのモバイルアプリ開発でclean architectureを導入していたこともあり、勢いでやっていくことにしました。
仕様
- requestを受け取ったら固定値を返す。
- queryParameterを受け取ったらそれに応じて絞り込みくらいはしたい。
- ちょっと外部APIからデータを引いてくるところもある。
- ソースを弄らなくてもレスポンスを変えられる。
- いつでもぶっ壊せる
clean architectureについて
大量の学習コストとファイル数を犠牲に、無限の拡張性を手に入れることができる設計です。
今回は、後で裏側にDB繋げたくなりそうだったので導入に踏み切りました。
詳細は以下の記事を参照してください。
(The Clean Architecture)
https://8thlight.com/blog/uncle-bob/2012/08/13/the-clean-architecture.html
結果
挫折しました。
EntityとModelのtranslate, またrepositoryのIF提供あたりの理解があやふやでした……。
また、api以外のアクセスがあった場合、吸収しきれていません。
とりあえず完成したゆるふわ設計を書きます。
ソース本体は業務の都合上公開できないので……別途書きたいです。
- main.go
- go/
- infra/
- generator/
- res/
- リスト系のdummyData.json
- 固定値を返すgenerator
- api/
- repository/
- repositoryの実装
- domain/
- repository(IF)/
- model/
- usecase/
- handler/
- controller
- api/
- request/
- apiClient.go
- httpHeaderValidator.go
- validator/
- routers.go
構成詳細
大きく見ると3層です。
handler
clientから受け取ったリクエストを処理してusecaseに渡します。
validationはここで済ませておき、usecaseには安全な構造体が渡るようにします。
- controller
- handlerの花形です。
- handlerでの処理を司ります。
- api
- httpアクセスを受けた場合のパッケージです。
- httpヘッダーのバリデーションのみ内部で片付けます。
- request
- apiのrequestのentityです。そのままですね。
- validator
- apiのrequestをvalidationします。
domain
ビジネスロジックを提供します。
- repository
- infra層からデータを受け取ります。
- このあたりで設計が崩れている気がする……。
- データの絞り込みもここでやっつけます。
- model
- domain内で処理するオブジェクトの構造体を定義します。
- usecase
- ビジネスロジックを書きます。
- 必要なデータに応じてrepositoryを呼びます。
infra
usecaseに返却するdataを生成します。
今回はほぼほぼ固定値を返すだけなので、entityはサボってます。
- generator
- 固定値を生成します。
- 履歴等、大量かつ本アプリを使ったテスト時に変更が求められそうなものはjsonにしてres/内に切り出しています。
- api
- 一部外部のAPIからデータを引っ張ってきているので、それはここで処理します。
感想
Go自体に継承がないとか色々戸惑うことはありましたが、馴染みやすくとても可愛い言語でした。
また、設計だけでなく、loggingなどフレームワークが隠蔽していたところも意識するようになりました。今後ともいじっていきたいです。
TODO
- repositoryをちゃんとIFでメソッドを提供する。
- exceptionを別でパッケージ切って定義する。
- apiのvalidation周りのエラーハンドリングがグダグダになっているので、ちゃんと整理したいです。
参考
https://qiita.com/koutalou/items/07a4f9cf51a2d13e4cdc
https://www.slideshare.net/kenjitanaka58/5-66290992
https://thenewstack.io/make-a-restful-json-api-go/
Appendix
library
- net/http
- gorilla/mux
- encoding/json
- log
- go-playground/validator.v9