NodeのIsomorphicなREST APIフレームワークLoopBackについて調べてみた


## LoopBackとは？

- `rapid API generation`に特化したNodeフレームワーク
- モデルを定義すると、CRUDの操作が可能なREST APIが自動的に生成される
- とにかく素早く作ることに焦点をおいている印象
- クライアントとのコード共通化(`Isomorphic JavaScript`)も推している
- 内部でSwaggerが組み込まれているらしく、`http://localhost:3000/explorer`にアクセスすることで[こちら](https://loopback.io/doc/en/lb3/Use-API-Explorer.html)のようなAPIドキュメントを確認することができる。
- [他フレームワークとの比較](http://loopback.io/resources/#compare)
- [LoopBackとは - Documentation](https://docs.strongloop.com/display/JA/LoopBack)
- [LoopBack core concepts - Documentation](https://docs.strongloop.com/display/JA/LoopBack+core+concepts)


## 実装の雰囲気

- ECMAScriptなどで書けば特に普通のJavaScriptと変わらない
- モダンなサンプルがあるにはあるが、あまり多くない/ガッツリ作っているものは少ない印象
- 全体として英語でも情報が少ないのが気になる


## ディレクトリ構成

- [Project layout reference | LoopBack Documentation](https://loopback.io/doc/en/lb3/Project-layout-reference.html)
- [Learn more | LoopBack Documentation](https://loopback.io/doc/en/lb3/Learn-more.html)
- REST以上のAPIや、処理のカスタマイズをしたい場合は`server/models`に付け足してゆく
  - [Remote methods | LoopBack Documentation](http://loopback.io/doc/en/lb2/Remote-methods.html)
  - [Customizing models | LoopBack Documentation](https://loopback.io/doc/en/lb3/Customizing-models.html)
- なかなか記事が見つからなかったので、ベストプラクティスはやりながらみつけていくしかないかもしれない。このへんに学習コストがありそう


## モデル/ORM

- [Working with data | LoopBack Documentation](https://loopback.io/doc/en/lb3/Working-with-data.html)
- 基本的なORMが使える
- JSONファイルに[モデルの設定](http://loopback.io/doc/en/lb2/Model-definition-JSON-file.html)を記述してゆく
  - プロパティ
  - リレーション
  - バリデーションルール
  - スコープ
  - メソッド
  - など


## トランザクション

- [Using database transactions | LoopBack Documentation](https://loopback.io/doc/en/lb3/Using-database-transactions.html)
- [Implementing create, retrieve, update, and delete methods | LoopBack Documentation](https://loopback.io/doc/en/lb2/Implementing-create-retrieve-update-and-delete-methods.html)
- トランザクションをちゃんとやりたいなら、自動生成されるREST APIは使えないかも？
- ちょっと調べただけだとわからなかった(特に明記してあるリソースがなかった)ので、調査する必要はある。


## DBマイグレーション

- [Creating a database schema from models | LoopBack Documentation](https://loopback.io/doc/ja/lb3/Creating-a-database-schema-from-models.html)
- [Implementing auto-migration | LoopBack Documentation](https://loopback.io/doc/en/lb3/Implementing-auto-migration.html)
- [MySQL connector | LoopBack Documentation](https://loopback.io/doc/ja/lb3/MySQL-connector.html)
- マイグレーション用コードを書いておいて実行するような感じ


## パッケージ管理

- 普段通りnpmかyarnでOK


## バリデーション

- [Validating model data | LoopBack Documentation](https://loopback.io/doc/en/lb3/Validating-model-data.html)
- 基本的なバリデーションメソッドが用意されている


## テスト

- LoopBack(v3)では特に提供していない
- AVAなどを使ったいつものテストに加え、ExpressなどNodeのテストを参考にすればかけそう
  - ユニットテスト
  - DB分離
  - テストダブル
  - などを考慮
- [Testing your application | LoopBack Documentation](https://loopback.io/doc/en/lb4/Testing-your-application.html)
- [Testing the API | LoopBack Documentation](https://loopback.io/doc/en/lb4/Testing-the-API.html)
- [Loopback testing with supertest, mocha and models - Stack Overflow](https://stackoverflow.com/questions/35005001/loopback-testing-with-supertest-mocha-and-models)
- [Loopback testing upload file as a user with role - Stack Overflow](https://stackoverflow.com/questions/34065687/loopback-testing-upload-file-as-a-user-with-role)
- [Unit testing Loopback models - Stack Overflow](https://stackoverflow.com/questions/40229171/unit-testing-loopback-models)
- サーバーサイドのテストとして、他に何か考慮することがあるか？
- LoopBackのドキュメント(v3)でテストについて書かれていないのが気になる…


## デバッグ/エラーハンドリング

- [Running and debugging apps | LoopBack Documentation](https://loopback.io/doc/en/lb3/Running-and-debugging-apps.html)
- いつものJSと同じ。+↑でいい感じにできそう


## 工数感

- 最初は設計部分など迷うことがありそう
- CRUD+αレベルであればすぐ作れそう
- LoopBackで自動生成できるところを上手く使えると工数削減できそう
- 情報量が少ないように感じる。LoopBack自体に依存する部分はそんなに多くはないかもしれないが、フレームワークがブラックボックスにしている部分はハマることはあるかもしれない。


## その他

### その他の参考

- [Web API フレームワーク LoopBack で遊んでみる - Qiita](https://qiita.com/kyrieleison/items/defee6a9450b18ae9554)
- [LoopBack.jsで高速REST API開発 〜ゼロから開発、APIの使い方まで〜 - Qiita](https://qiita.com/takehilo/items/0b25fb10fa3d91975538)
- [Loopbackフレームワーク入門 | Now or Never](http://www.gologo13.com/2014/12/09/nodejs-loopback/)
- [Why LoopBack Is Better Than ExpressJS? – Hacker Noon](https://hackernoon.com/why-loopback-is-better-than-expressjs-bcf01de87582)
- [StrongLoop - Working with LoopBack’s Object-Relational Mapping (ORM) System](https://strongloop.com/strongblog/working-with-loopbacks-orm/)
- [Roll Your Own API vs. LoopBack](http://blog.jeffdouglas.com/2015/07/07/roll-your-own-api-vs-loopback/)
- [LoopBack資料まとめ - Qiita](https://qiita.com/hashrock/items/ee440d9df36416826b63)

### サンプルアプリケーション

- [Tutorials and examples | LoopBack Documentation](https://loopback.io/doc/en/lb3/Tutorials-and-examples.html)
- [damassi/loopback-isomorphic-react-example: ES6 (server / client) + Hot Reload Enabled + Loopback for API + Isomorphic + Local CSS-Modules + React Router + Flux Demo](https://github.com/damassi/loopback-isomorphic-react-example)
- [cslinmiso/loopback-vue-boilerplate: A boilerplate for a Vue application using LoopBack, build with Webpack.](https://github.com/cslinmiso/loopback-vue-boilerplate)