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
390
NestJS と Hasura で実現する Production GraphQL
NestJS meetup Online #1 by @kimujun
kimujun
September 29, 2022
Tweet
Share
More Decks by kimujun
See All by kimujun
Datasets for Critical Operations by Dataform
kimujun
0
210
飲食店データの分析事例とそれを支えるデータ基盤
kimujun
0
460
小規模に始めるデータメッシュとデータガバナンスの実践
kimujun
4
1.1k
Hasura の Subscription と向き合う
kimujun
0
1.3k
Other Decks in Programming
See All in Programming
Deep Dive into Kotlin Flow
jmatsu
1
370
Navigating Dependency Injection with Metro
zacsweers
3
3.5k
知っているようで知らない"rails new"の世界 / The World of "rails new" You Think You Know but Don't
luccafort
PRO
1
190
時間軸から考えるTerraformを使う理由と留意点
fufuhu
16
4.8k
Rancher と Terraform
fufuhu
2
550
AWS発のAIエディタKiroを使ってみた
iriikeita
1
190
print("Hello, World")
eddie
2
530
1から理解するWeb Push
dora1998
7
1.9k
Namespace and Its Future
tagomoris
6
710
Processing Gem ベースの、2D レトロゲームエンジンの開発
tokujiros
2
130
HTMLの品質ってなんだっけ? “HTMLクライテリア”の設計と実践
unachang113
4
2.9k
2025 年のコーディングエージェントの現在地とエンジニアの仕事の変化について
azukiazusa1
24
12k
Featured
See All Featured
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
44
2.5k
Making Projects Easy
brettharned
117
6.4k
Optimizing for Happiness
mojombo
379
70k
Large-scale JavaScript Application Architecture
addyosmani
513
110k
How to Think Like a Performance Engineer
csswizardry
26
1.9k
Why Our Code Smells
bkeepers
PRO
339
57k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
3k
Optimising Largest Contentful Paint
csswizardry
37
3.4k
Statistics for Hackers
jakevdp
799
220k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
46
7.6k
Facilitating Awesome Meetings
lara
55
6.5k
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 最高!