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
320
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
2
170
Hasura の Subscription と向き合う
kimujun
0
1.1k
Other Decks in Programming
See All in Programming
Vertical Architectures for Scalable Angular Applications
manfredsteyer
PRO
0
290
Workflow automationによるインシデント原因調査の自動化
showwin
1
120
Go言語でターミナルフレンドリーなAIコマンド、afaを作った/fukuokago20_afa
monochromegane
2
140
CPython 인터프리터 구조 파헤치기 - PyCon Korea 24
kennethanceyer
0
210
tc39 x jsconf.jp Panel Discussion 2024
yosuke_furukawa
PRO
0
130
デプロイを任されたので、教わった通りにデプロイしたら障害になった件 ~俺のやらかしを越えてゆけ~
techouse
50
30k
詳細解説! ArrayListの仕組みと実装
yujisoftware
0
420
ピラミッド、アイスクリームコーン、SMURF: 自動テストの最適バランスを求めて / Pyramid Ice-Cream-Cone and SMURF
twada
PRO
8
670
カスタムしながら理解するGraphQL Connection
yanagii
0
680
Vue SFCのtemplateでTypeScriptの型を活用しよう
tsukkee
3
1.4k
Nuxtベースの「WXT」でChrome拡張を作成する | Vue Fes 2024 ランチセッション
moshi1121
1
260
のびしろを広げる巻き込まれ力:偶然を活かすキャリアの作り方/oso2024
takahashiikki
1
350
Featured
See All Featured
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
32
1.8k
Code Review Best Practice
trishagee
64
17k
The Power of CSS Pseudo Elements
geoffreycrofte
72
5.3k
Imperfection Machines: The Place of Print at Facebook
scottboms
264
13k
We Have a Design System, Now What?
morganepeng
50
7.2k
Producing Creativity
orderedlist
PRO
341
39k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
167
49k
Agile that works and the tools we love
rasmusluckow
327
21k
Building Your Own Lightsaber
phodgson
102
6k
RailsConf 2023
tenderlove
29
870
The Art of Programming - Codeland 2020
erikaheidi
51
13k
Stop Working from a Prison Cell
hatefulcrawdad
267
20k
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 最高!