Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
NestJS と Hasura で実現する Production GraphQL
Search
kimujun
September 29, 2022
Programming
0
360
NestJS と Hasura で実現する Production GraphQL
NestJS meetup Online #1 by @kimujun
kimujun
September 29, 2022
Tweet
Share
More Decks by kimujun
See All by kimujun
飲食店データの分析事例とそれを支えるデータ基盤
kimujun
0
340
小規模に始めるデータメッシュとデータガバナンスの実践
kimujun
4
940
Hasura の Subscription と向き合う
kimujun
0
1.2k
Other Decks in Programming
See All in Programming
Software Architecture
hschwentner
6
2.1k
お前もAI鬼にならないか?👹Bolt & Cursor & Supabase & Vercelで人間をやめるぞ、ジョジョー!👺
taishiyade
6
4k
昭和の職場からアジャイルの世界へ
kumagoro95
1
380
ARA Ansible for the teams
kksat
0
150
SwiftUI Viewの責務分離
elmetal
PRO
1
240
富山発の個人開発サービスで日本中の学校の業務を改善した話
krpk1900
4
390
DROBEの生成AI活用事例 with AWS
ippey
0
130
データの整合性を保つ非同期処理アーキテクチャパターン / Async Architecture Patterns
mokuo
47
17k
sappoRo.R #12 初心者セッション
kosugitti
0
260
個人アプリを2年ぶりにアプデしたから褒めて / I just updated my personal app, praise me!
lovee
0
350
Lottieアニメーションをカスタマイズしてみた
tahia910
0
130
How mixi2 Uses TiDB for SNS Scalability and Performance
kanmo
38
14k
Featured
See All Featured
Building Applications with DynamoDB
mza
93
6.2k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
6
550
A better future with KSS
kneath
238
17k
Scaling GitHub
holman
459
140k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
120k
Site-Speed That Sticks
csswizardry
4
380
[RailsConf 2023] Rails as a piece of cake
palkan
53
5.2k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
59k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
175
51k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
30
4.6k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.1k
A Modern Web Designer's Workflow
chriscoyier
693
190k
Transcript
NestJS と Hasura で実現する Production GraphQL NestJS meetup Online #1
きむじゅん @kimujun (Twitter: @1130_kimu) • 株式会社 dinii ソフトウェアエンジニア (新卒入社) •
TypeScript/React/Hasura が好き • 趣味は食🍜、麻雀🀄などなど
• モバイルオーダーと POS レジを中心に飲食のインフラを作るスタートアップ ◦ ID の力で飲食業界の CRM を進化させようとしています •
TypeScript/React/React Native に特化したスタックで開発 ◦ 詳しくはこちらの記事で! • エンジニア全員がフルスタックエンジニア ダイニーとは
NestJS と Hasura で約 2 年間本番運用を行っている弊社が どのような工夫をしているのかお話しします
Topics 1. NestJS による GraphQL サーバー 2. Hasura と Remote
Schema 3. Remote Schema として接続する 4. まとめ
Topics 1. NestJS による GraphQL サーバー 2. Hasura と Remote
Schema 3. Remote Schema として接続する 4. まとめ
GraphQLModule • Apollo GraphQL サーバーの実装をラップしている • Main module で読み込むと GraphQL
サーバーになってくれる • introspection: true にすると /graphql で introspection ができる ◦ 単に introspection: true とするとセキュリティ上のリスク があります ◦ 認証のためのプラグイン を挟むことで回避できます
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 を採用しています
Topics 1. NestJS による GraphQL サーバー 2. Hasura と Remote
Schema 3. Remote Schema として接続する 4. まとめ
Hasura とは • DB に直接接続し GraphQL エンドポイントを提供するミドルウェア ◦ スキーマからリゾルバーを自動で定義するので SDL
を用意する必要がない • マイグレーションの機能も持つ ◦ コンソールからテーブルを編集するとマイグレーションファイルを生成する ◦ ↑が便利 & メタデータの管理も楽なので基本は Hasura に任せたい • マイグレーションを任せると ORM との併用がちょっと大変 ◦ 後で説明します https://hasura.io/
Remote Schema • 指定した Hasura 外部の GraphQL Schema を取り込み、マージする機能 ◦
複雑なビジネスロジックをクライアントに持たせたくない場合 ◦ 重いクエリを Hasura に任せたくない場合 • マージは introspection で返ってきたスキーマを元に行う
Topics 1. NestJS による GraphQL サーバー 2. Hasura と Remote
Schema 3. Remote Schema として接続する 4. まとめ
NestJS サーバーを Hasura に接続 • NestJS による GraphQL サーバーを Remote
Schema に登録できる ◦ introspection の機能を持つため • Query も Mutation も難しい or パフォーマンスが必要なものは NestJS に投げるという使い分けができる ◦ Query → 集計など ◦ Mutation → 注文や会計など ダイニーのエンジニアリング 3カ条
開発の流れ 店舗作成を目的とした Mutation を 実装するフロー
課題 • TypeORM のスキーマ情報 (entity ファイル) と実際の DB の構成が乖離する ◦
TypeORM のマイグレーション機能を使わないため ◦ entity ファイルを手動で更新するので間違える ダイニーの対策 • CI で差分のチェックをする 1. Hasura によるマイグレーションを行う 2. TypeORM の migration:generate を行う 3. 差分が出なれけば Success, 出れば Fail とする
実際の CI の様子 Hasura 経由で shop テーブルに foo カラムを追加した場合。 entity
ファイルの更新をしていないためエラーが出て CI が落ちている
Topics 1. NestJS による GraphQL サーバー 2. Hasura と Remote
Schema 3. Remote Schema として接続する 4. まとめ
まとめ • NestJS と Hasura の組み合わせで本番運用しているよ ◦ Code First のやり方で
GraphQL サーバーを簡単に作れる NestJS の強み • スキーマの整合性には注意が必要 • NestJS 最高!