Upgrade to Pro — share decks privately, control downloads, hide ads and more …

NestJS と Hasura で実現する Production GraphQL

kimujun
September 29, 2022

NestJS と Hasura で実現する Production GraphQL

NestJS meetup Online #1 by @kimujun

kimujun

September 29, 2022
Tweet

More Decks by kimujun

Other Decks in Programming

Transcript

  1. きむじゅん @kimujun (Twitter: @1130_kimu) • 株式会社 dinii ソフトウェアエンジニア (新卒入社) •

    TypeScript/React/Hasura が好き • 趣味は食🍜、麻雀🀄などなど
  2. • モバイルオーダーと POS レジを中心に飲食のインフラを作るスタートアップ ◦ ID の力で飲食業界の CRM を進化させようとしています •

    TypeScript/React/React Native に特化したスタックで開発 ◦ 詳しくはこちらの記事で! • エンジニア全員がフルスタックエンジニア ダイニーとは
  3. Topics 1. NestJS による GraphQL サーバー 2. Hasura と Remote

    Schema 3. Remote Schema として接続する 4. まとめ
  4. Topics 1. NestJS による GraphQL サーバー 2. Hasura と Remote

    Schema 3. Remote Schema として接続する 4. まとめ
  5. GraphQLModule • Apollo GraphQL サーバーの実装をラップしている • Main module で読み込むと GraphQL

    サーバーになってくれる • introspection: true にすると /graphql で introspection ができる ◦ 単に introspection: true とするとセキュリティ上のリスク があります ◦ 認証のためのプラグイン を挟むことで回避できます
  6. Code First と Schema First • Code First と Schema

    First ◦ Code First → TypeScript の型定義からスキーマを生成 ◦ Schema First → SDL を書きリゾルバーを定義 ▪ フロント・バックでスキーマを事前に決めておけるメリット ◦ メルカリ Shops さんの記事に詳しいです • フルスタックな開発では Schema First のメリットが薄い ◦ 後述の通り Hasura と併用するに当たっても Code First の方が都合良い ◦ NestJS の Code First の書きやすさもメリット → ダイニーでは Code First を採用しています
  7. Topics 1. NestJS による GraphQL サーバー 2. Hasura と Remote

    Schema 3. Remote Schema として接続する 4. まとめ
  8. Hasura とは • DB に直接接続し GraphQL エンドポイントを提供するミドルウェア ◦ スキーマからリゾルバーを自動で定義するので SDL

    を用意する必要がない • マイグレーションの機能も持つ ◦ コンソールからテーブルを編集するとマイグレーションファイルを生成する ◦ ↑が便利 & メタデータの管理も楽なので基本は Hasura に任せたい • マイグレーションを任せると ORM との併用がちょっと大変 ◦ 後で説明します https://hasura.io/
  9. Remote Schema • 指定した Hasura 外部の GraphQL Schema を取り込み、マージする機能 ◦

    複雑なビジネスロジックをクライアントに持たせたくない場合 ◦ 重いクエリを Hasura に任せたくない場合 • マージは introspection で返ってきたスキーマを元に行う
  10. Topics 1. NestJS による GraphQL サーバー 2. Hasura と Remote

    Schema 3. Remote Schema として接続する 4. まとめ
  11. NestJS サーバーを Hasura に接続 • NestJS による GraphQL サーバーを Remote

    Schema に登録できる ◦ introspection の機能を持つため • Query も Mutation も難しい or パフォーマンスが必要なものは NestJS に投げるという使い分けができる ◦ Query → 集計など ◦ Mutation → 注文や会計など ダイニーのエンジニアリング 3カ条
  12. 課題 • TypeORM のスキーマ情報 (entity ファイル) と実際の DB の構成が乖離する ◦

    TypeORM のマイグレーション機能を使わないため ◦ entity ファイルを手動で更新するので間違える ダイニーの対策 • CI で差分のチェックをする 1. Hasura によるマイグレーションを行う 2. TypeORM の migration:generate を行う 3. 差分が出なれけば Success, 出れば Fail とする
  13. 実際の CI の様子 Hasura 経由で shop テーブルに foo カラムを追加した場合。 entity

    ファイルの更新をしていないためエラーが出て CI が落ちている
  14. Topics 1. NestJS による GraphQL サーバー 2. Hasura と Remote

    Schema 3. Remote Schema として接続する 4. まとめ
  15. まとめ • NestJS と Hasura の組み合わせで本番運用しているよ ◦ Code First のやり方で

    GraphQL サーバーを簡単に作れる NestJS の強み • スキーマの整合性には注意が必要 • NestJS 最高!