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
420
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
NestJS と Hasura で実現する Production GraphQL
NestJS meetup Online #1 by @kimujun
kimujun
September 29, 2022
More Decks by kimujun
See All by kimujun
Datasets for Critical Operations by Dataform
kimujun
0
300
飲食店データの分析事例とそれを支えるデータ基盤
kimujun
0
520
小規模に始めるデータメッシュとデータガバナンスの実践
kimujun
4
1.2k
Hasura の Subscription と向き合う
kimujun
0
1.4k
Other Decks in Programming
See All in Programming
正しくソフトウェアを作る、前提を疑うための認知の視点 / doubt-premise
minodriven
21
7k
TSKaigi Night Talks 2026_TypeScriptでサプライチェーンの整合性を型に閉じ込める
geekplus_tech
0
400
トークンをケチるな、設計しろ:GitHub Copilotを賢く使うコンテキスト戦略
ochtum
0
140
エージェンティックRAGにAWSで入門しよう!
har1101
9
1.7k
Go1.27で導入されるジェネリクスメソッドでできること
mackee
0
170
ローカルLLMを使ってB2Bサービスを作っていての学び
yaotti
0
210
LLM本来の能力を解き放つサンドボックス技術とAI民主化への適用
yukukotani
3
4.5k
Even G2とAWSで推しのエージェントを召喚しよう!
har1101
1
120
ローカルLLMでどこまでコードが書けるか -拡張版 / How much code can be written on a local LLM Extended
kishida
12
4.4k
Strategic Design in the Frontend: Moduliths & Micro Frontends @DDDEurope
manfredsteyer
PRO
0
130
メソッドのジェネリクスでGoの夢は広がるか? / Kyoto.go #65
utgwkk
3
910
Lessons from Spec-Driven Development
simas
PRO
0
220
Featured
See All Featured
Git: the NoSQL Database
bkeepers
PRO
432
67k
Scaling GitHub
holman
464
140k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
480
Balancing Empowerment & Direction
lara
6
1.2k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
Documentation Writing (for coders)
carmenintech
77
5.4k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.5k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
320
Technical Leadership for Architectural Decision Making
baasie
3
420
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.3k
Designing Experiences People Love
moore
143
24k
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 最高!