Slide 1

Slide 1 text

NestJS と Hasura で実現する Production GraphQL NestJS meetup Online #1

Slide 2

Slide 2 text

きむじゅん @kimujun (Twitter: @1130_kimu) ● 株式会社 dinii ソフトウェアエンジニア (新卒入社) ● TypeScript/React/Hasura が好き ● 趣味は食🍜、麻雀🀄などなど

Slide 3

Slide 3 text

● モバイルオーダーと POS レジを中心に飲食のインフラを作るスタートアップ ○ ID の力で飲食業界の CRM を進化させようとしています ● TypeScript/React/React Native に特化したスタックで開発 ○ 詳しくはこちらの記事で! ● エンジニア全員がフルスタックエンジニア ダイニーとは

Slide 4

Slide 4 text

NestJS と Hasura で約 2 年間本番運用を行っている弊社が どのような工夫をしているのかお話しします

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

GraphQLModule ● Apollo GraphQL サーバーの実装をラップしている ● Main module で読み込むと GraphQL サーバーになってくれる ● introspection: true にすると /graphql で introspection ができる ○ 単に introspection: true とするとセキュリティ上のリスク があります ○ 認証のためのプラグイン を挟むことで回避できます

Slide 8

Slide 8 text

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 を採用しています

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

Hasura とは ● DB に直接接続し GraphQL エンドポイントを提供するミドルウェア ○ スキーマからリゾルバーを自動で定義するので SDL を用意する必要がない ● マイグレーションの機能も持つ ○ コンソールからテーブルを編集するとマイグレーションファイルを生成する ○ ↑が便利 & メタデータの管理も楽なので基本は Hasura に任せたい ● マイグレーションを任せると ORM との併用がちょっと大変 ○ 後で説明します https://hasura.io/

Slide 11

Slide 11 text

Remote Schema ● 指定した Hasura 外部の GraphQL Schema を取り込み、マージする機能 ○ 複雑なビジネスロジックをクライアントに持たせたくない場合 ○ 重いクエリを Hasura に任せたくない場合 ● マージは introspection で返ってきたスキーマを元に行う

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

NestJS サーバーを Hasura に接続 ● NestJS による GraphQL サーバーを Remote Schema に登録できる ○ introspection の機能を持つため ● Query も Mutation も難しい or パフォーマンスが必要なものは NestJS に投げるという使い分けができる ○ Query → 集計など ○ Mutation → 注文や会計など ダイニーのエンジニアリング 3カ条

Slide 14

Slide 14 text

開発の流れ 店舗作成を目的とした Mutation を 実装するフロー

Slide 15

Slide 15 text

課題 ● TypeORM のスキーマ情報 (entity ファイル) と実際の DB の構成が乖離する ○ TypeORM のマイグレーション機能を使わないため ○ entity ファイルを手動で更新するので間違える ダイニーの対策 ● CI で差分のチェックをする 1. Hasura によるマイグレーションを行う 2. TypeORM の migration:generate を行う 3. 差分が出なれけば Success, 出れば Fail とする

Slide 16

Slide 16 text

実際の CI の様子 Hasura 経由で shop テーブルに foo カラムを追加した場合。 entity ファイルの更新をしていないためエラーが出て CI が落ちている

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

まとめ ● NestJS と Hasura の組み合わせで本番運用しているよ ○ Code First のやり方で GraphQL サーバーを簡単に作れる NestJS の強み ● スキーマの整合性には注意が必要 ● NestJS 最高!