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
NuxtJS + REST APIで運用中サービスをNuxtJS + GraphQLに変更した...
Search
gree_tech
PRO
September 18, 2020
Technology
0
450
NuxtJS + REST APIで運用中サービスをNuxtJS + GraphQLに変更したことによる光と影
GREE Tech Conference 2020 で発表された資料です。
https://techcon.gree.jp/2020/session/Session-2
gree_tech
PRO
September 18, 2020
Tweet
Share
More Decks by gree_tech
See All by gree_tech
コミュニケーションに鍵を見いだす、エンジニア1年目の経験談
gree_tech
PRO
0
120
REALITY株式会社における開発生産性向上の取り組み: 失敗と成功から学んだこと
gree_tech
PRO
2
1.7k
『ヘブンバーンズレッド』におけるフィールドギミックの裏側
gree_tech
PRO
2
560
セキュリティインシデント対応の体制・運用の試行錯誤 / greetechcon2024-session-a1
gree_tech
PRO
1
560
『アナザーエデン 時空を超える猫』国内海外同時運営実現への道のり ~別々で開発されたアプリを安定して同時リリースするまでの取り組み~
gree_tech
PRO
1
530
『アサルトリリィ Last Bullet』におけるクラウドストリーミング技術を用いたブラウザゲーム化の紹介
gree_tech
PRO
1
610
UnityによるPCアプリの新しい選択肢。「PC版 Google Play Games」への対応について
gree_tech
PRO
1
970
実機ビルドのエラーによる検証ブロッカーを0に!『ヘブンバーンズレッド』のスモークテスト自動化の取り組み
gree_tech
PRO
1
630
"ゲームQA業界の技術向上を目指す! 会社を超えた研究会の取り組み"
gree_tech
PRO
1
750
Other Decks in Technology
See All in Technology
Tech-Verse 2025 Global CTO Session
lycorptech_jp
PRO
0
1k
Oracle Cloud Infrastructure:2025年6月度サービス・アップデート
oracle4engineer
PRO
2
310
解析の定理証明実践@Lean 4
dec9ue
1
190
モバイル界のMCPを考える
naoto33
0
280
KubeCon + CloudNativeCon Japan 2025 Recap
ren510dev
1
290
Delegating the chores of authenticating users to Keycloak
ahus1
0
130
KubeCon + CloudNativeCon Japan 2025 Recap by CA
ponkio_o
PRO
0
240
WordPressから ヘッドレスCMSへ! Storyblokへの移行プロセス
nyata
0
310
How Community Opened Global Doors
hiroramos4
PRO
1
130
変化する開発、進化する体系時代に適応するソフトウェアエンジニアの知識と考え方(JaSST'25 Kansai)
mizunori
1
260
CI/CD/IaC 久々に0から環境を作ったらこうなりました
kaz29
1
200
整頓のジレンマとの戦い〜Tidy First?で振り返る事業とキャリアの歩み〜/Fighting the tidiness dilemma〜Business and Career Milestones Reflected on in Tidy First?〜
bitkey
0
160
Featured
See All Featured
Into the Great Unknown - MozCon
thekraken
39
1.9k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
5
230
Fantastic passwords and where to find them - at NoRuKo
philnash
51
3.3k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.3k
YesSQL, Process and Tooling at Scale
rocio
173
14k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
50k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
34
3.1k
Gamification - CAS2011
davidbonilla
81
5.3k
Raft: Consensus for Rubyists
vanstee
140
7k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
20
1.3k
Adopting Sorbet at Scale
ufuk
77
9.4k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
46
9.6k
Transcript
NuxtJS + REST APIで 運用中サービスをNuxtJS + GraphQL に変更したことによる光と影 アウモ株式会社 エンジニアチームマネージャー
村田翔
自己紹介 2 • 名前 • 村田 翔 • 担当 •
サーバーサイド兼フロントエンドエンジニア • メインはRuby on Rails • aumo歴 • 3年弱(サーバーサイドでは最古参) • 旅行好きなのもあって、aumoに長らく在籍
3 ⓘ Start presenting to display the poll results on
this slide. aumoはご存知ですか?
• おでかけ領域をメインに、旅行やグルメ情報をお届けするメディア • アプリ • Webサービス aumoはご存知ですか? 4 記事サイト 比較サイト
<- 今回NuxtJS + GraphQLに変更した対象
5 記事 × SNS iOS Android
6 記事 × ユーザー生成コンテンツ
7 記事 × ユーザー生成コンテンツ × ホテル × 宿泊プラン横断検索
8 記事 × ユーザー生成コンテンツ × グルメ
9 記事 × ユーザー生成コンテンツ × レジャー・ショッピング
1.なぜREST APIからGraphQLに変更したのか 2.GraphQL化して見えたこと • 光 • エンドポイント • 仕様変更 •
影 • N+1 • エラーハンドリンク • ログ解析 今日お伝えすること 10
1.なぜREST APIからGraphQLに変更したのか 2.GraphQL化して見えたこと • 光 • エンドポイント • 仕様変更 •
影 • N+1 • エラーハンドリンク • ログ解析 今日お伝えすること 11
12 ⓘ Start presenting to display the poll results on
this slide. GraphQL使っていますか?
• バックエンド • Ruby on Rails • REST API •
GraphQL • graphql • graphql-batch • graphiql-rails • フロントエンド • NuxtJS • ログ監視 • Papertrail • Sentry 構成 13
構成 14 Amazon EC2 Amazon EC2 ELB サブドメインで 3サイトを同一インスタンスに搭載 フロントエンド
バックエンド
構成 15 Amazon EC2 Amazon EC2 ELB サブドメインで3サイト搭載 • middlewareでFQDN毎にパスチェック
• 各トップページはFQDNを元にコンポーネント出しわけ • 各詳細ページはNuxtJSのディレクトリ規約に沿って設置 フロントエンドでのサイト分割
• エンドポイントを極力増やしたくない • 工数削減 16
初期から3サイト作成 という要件なのかというと... 17
初期要件 18 • ホテルの比較サイトを作りましょう • 単一サイトなので既存の記事サイト同様にバックエンドはREST API でいいか
• グルメのサイトも作りましょう • バックエンドはAPIのエンドポイント増やして対応すればいいか 要件追加 19
要件追加 20 • レジャー・ショッピングのサイトも作りましょう • さらに別ジャンルで展開する可能性出てくるなこれ🤔 • APIのエンドポイントを都度増やしていくのは何だかなぁ
要件追加 21 • 各サイトを巡回されるような動線になる要素欲しいですね • 各サイト用に用意しているAPIエンドポイントそれぞれ修正いるな • API多いと作業煩雑だし、また類似の要件追加くるだろなこれ 🤔
そこで... 22
• クエリ言語 • エンドポイント単一 • 必要な情報だけ取得できる • クエリで指定したフィールドのみ返却される • Facebook社が2012年から開発
• 採用している組織はFacebook、GitHub、PayPalなど数百を越す GraphQLとは 23
各サイトで必要な情報を共通のエンドポイントで 網羅できるのは、実装が楽になりそうな予感! ※新しい技術を取り入れたい欲有あり 24
実際にREST API -> GraphQL化してみた 25
1.なぜREST APIからGraphQLに変更したのか 2.GraphQL化して見えたこと • 光 • エンドポイント • 仕様変更 •
影 • N+1 • エラーハンドリンク • ログ解析 今日お伝えすること 26
エンドポイント 27 [GET] /api/v1/hotels [GET] /api/v1/hotels/{hotel_id} [GET] /api/v1/hotels/search [GET] /api/v1/gourmets
[GET] /api/v1/gourmets/{gourmet_id} ・ ・ ・ ルーティング追加して、 コントローラー追加して、 ビュー追加して・・・ • サイト追加毎に増えていくエンドポイント...
• エンドポイント単一 エンドポイント 28 [GET] /api/v1/hotels [GET] /api/v1/hotels/{hotel_id} [GET] /api/v1/hotels/search
[GET] /api/v1/gourmets [GET] /api/v1/gourmets/{gourmet_id} ・ ・ ・ ルーティング追加して、 コントローラー追加して、 ビュー追加して・・・ [POST] /graphql スキーマとフィールド更新のみ ×
• 各サイトの詳細ページに周辺施設情報の要素追加したい 画面仕様変更への対応 仕様変更 29
• REST APIの場合 • バックエンド • 対象エンドポイントのレスポンスに要素追加 or エンドポイント追加 •
フロントエンド • 新規要素表示 • エンドポイント追加の場合は新たに呼び出し追加 各サイトの詳細ページに周辺施設情報の要素追加したい 仕様変更 30
• GraphQLの場合 • バックエンド • スキーマとフィールド更新 • フロントエンド • 新規要素表示
• クエリに新規で追加する要素を追記 各サイトの詳細ページに周辺施設情報の要素追加したい 仕様変更 31
追加の場合はあまり工数的にかわらなそう🤔 各サイトの詳細ページに周辺施設情報の要素追加したい 仕様変更 32
• REST APIの場合 • バックエンド • 対象のエンドポイントのレスポンスから削除 or エンドポイント追加 •
フロントエンド • 要素削除 各サイトの詳細ページに周辺施設情報の要素削除したい 仕様変更 33
各サイトの詳細ページに周辺施設情報の要素削除したい 仕様変更 34 • GraphQLの場合 • バックエンド • そのまま •
フロントエンド • 要素削除
各サイトの詳細ページに周辺施設情報の要素削除したい 仕様変更 35 • 要素削除の場合はフロントエンドの修正だけでいける • バックエンドは対象の要素をクエリで指定されない限り、その要素を 取得する処理は走らないため無駄が出ない
1.なぜREST APIからGraphQLに変更したのか 2.GraphQL化して見えたこと • 光 • エンドポイント • 仕様変更 •
影 • N+1 • エラーハンドリンク • ログ解析 今日お伝えすること 36
• スキーマ毎にクエリが走る associationが適切なタイミングでeager loadされていない N+1 37
• loadの該当fieldを要求されたときだけeager loadが走り、事 後でWHERE INされる graphql-batchを導入 N+1 38
• フロントエンドでレスポンスステータスによるエラーハンドリ ングができない GraphQLは常にレスポンスステータス200を返却する エラーハンドリング 39 ×
• catchの中でerror関数を呼ぶ レスポンスステータスによるエラーハンドリングは行わない エラーハンドリング 40
• エンポイントが単一なため全て request_uri: /graphql • レスポンス速度の調査などで問題箇所の洗い出しが困難 リクエストパス毎の解析ができない ログ解析 41
• リクエストボディ毎に分けることで呼び出し箇所の分類できる • レスポンス速度などに問題がある箇所の特定できる リクエストボディまでログに出力する ログ解析 42
まとめ 43
• エンドポイントを極力増やしたくない ◦ 同じ情報を複数サービスで使い回す場合に有効 • 工数削減 ◦ 画面要件が頻繁に変わるサービスでは効果高い 44 ୡ
ୡ
45