Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
出前館Webフロントエンドリプレイスプロジェクトの取り組みと反省について
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
株式会社出前館
November 01, 2023
Technology
1.9k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
出前館Webフロントエンドリプレイスプロジェクトの取り組みと反省について
株式会社出前館
November 01, 2023
More Decks by 株式会社出前館
See All by 株式会社出前館
出前館のメニュー登録・更新用APIをSpring Boot+Kafkaで実現したお話
demaecan
0
230
現実的なセキュリティ体制の構築 限られたリソースの中で成果を最大化する「選択と集中」
demaecan
7
4.8k
中期計画、2回作ってみた ~業務委託と正社員、両方の視点から~
demaecan
1
1.2k
複雑にからみあう複数のシステムを要する出前館QAの実情、展望
demaecan
0
220
QA業務を変える(!?)AIを併用した不具合分析の実践
demaecan
0
260
出前館アプリの品質を支えるリリーストレインとその実践
demaecan
0
300
出前館アプリ進化論 アーキテクチャと組織のリアルな変⾰の舞台裏
demaecan
0
970
Flutterにしてよかった?出前館アプリを2年運用して気づいたことを全部話します
demaecan
1
1.4k
Boxを“使われる場”にする統制と自動化の仕組み
demaecan
1
530
Other Decks in Technology
See All in Technology
module Synths; end
asonas
1
130
Microsoft 365 Copilot chat -tekoälypalvelun tietosuojaongelmat
hponka
0
740
薬剤師(ドメインエキスパート)と一緒に育てる薬局向けAIアシスタント
kakehashi
PRO
2
150
AI時代のAPI品質を支えるガードレール / API Guardrails for API quality in the AI era
yokawasa
1
220
Redmine 7.0で私が開発した新機能の狙いと背景
vividtone
1
160
Amazon Quick on DesktopがIAM Identity Centerで動かない理由
yukiogawa
0
170
AIエージェントの自己改善をどう設計するか / How to Design Self-Improvement for AI Agents
22mi
3
2.1k
株式会社シーエーシー エンジニア向け会社紹介資料
cac
0
57k
KPIだけでは評価できないプロダクトが考えるべき Evalsという第二の評価系 / Beyond KPIs: Evals as a Second Evaluation Framework for Products #PdEConf
aki_iinuma
4
3.9k
Screen Lens - 今見てる画面を翻訳する
komagata
0
250
Oracle Cloud Infrastructure IaaS 新機能アップデート 2026/6 - 2026/8
oracle4engineer
PRO
0
170
synctest時代のhttptest Go 1.27で変わるHTTPサーバテストの裏側 / go conference2026 synctest and httptest
budougumi0617
1
2.7k
Featured
See All Featured
Making Projects Easy
brettharned
120
6.7k
Documentation Writing (for coders)
carmenintech
77
5.5k
The Limits of Empathy - UXLibs8
cassininazir
1
650
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.5k
Darren the Foodie - Storyboard
khoart
PRO
3
3.9k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.8k
Designing for Performance
lara
611
70k
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
660
Deep Space Network (abreviated)
tonyrice
0
300
Odyssey Design
rkendrick25
PRO
2
800
Speed Design
sergeychernyshev
33
2.1k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
Transcript
出前館Webフロントエンドにおけるリプレイス プロジェクトの取り組みと反省 株式会社出前館 Taiki Shiraishi / 白石 泰己
自己紹介 株式会社出前館 フロントエンドグループ グループマネージャー Taiki Shiraishi / 白石泰己 ユーザー向け Web
サイト開発 UI制作が好きなフロントエンドエンジニア
• 個人発表ではなくチームを代表して発表 • チームの取り組んできた内容について • チーム構成 12 名 発表の内容について
1 2 3 4 5 目次 PHP から Next.js への刷新
BFF パターンの採用 GraphQL の採用 モノレポの採用 コンポーネントディレクトリの変更
出前館 Web フロントエンドリプレイス • 開発体制の内製化 • フロントエンドチーム • 2021年からビッグ・リライト中 •
PHP + jQueryからNext.jsへの刷新 ◦ より効率的な開発が可能 内製化 技術刷新
出前館 Web フロントエンドリプレイス Before Browser PHP App Legacy API Redis
DB
出前館 Web フロントエンドリプレース After Browser BFF App Legacy API Redis
DB Micro Service A Micro Service B
1 2 3 4 PHPからNext.jsへの刷新理由 フロントエンドチームに PHP 知見ある人が少なかった 既存のコードの保守性の問題 MVCフレームワークでありながらControllerが肥大化
内製化によるPHPの知識不足 フロントエンドのベストプラクティスを適用しやすい環境に バグを減らして、できるだけ早くコードをリリースしたい SSG、SSR、 CSRを同時にできるフレームワークは当時は一択 採用活動にも有利 Reactコミュニティの大きさ
Next.js に満足
1 2 3 BFF(Backend For Frontend)パターンの採用理由 バックエンドのマイクロサービス化 セッション管理 PHP で行っていたセッション管理の構成を引き継ぐ
Aggregation Gateway層の必要性 アプリと Web で処理が重複 → BFF で共通化 • 待ち時間の計算 • 店舗の商品の時間帯別ソート • 暗号化/復号化 アプリと Web で 1 つの BFF にすることとした モバイルアプリと Web のロジックの共通化
Good 👍 BFFパターンの採用 その後 • ViewModel の共通化 • テストコードもかけた •
フロントチームだけで整形を完結でき る • 開発組織内でも責務の認識齟齬 ◦ ビジネスロジックを持ちオーケストレーション 層だと思われる • アプリの改修時にもフロントエンドチーム の稼働が発生 • フロントエンドエンジニアがインフラを構 築・運用管理したり、オブザーバビリティ をきちんとするまでにいたるのには大変 • 今までブラウザサイドの経験しかないメン バーでやるのは大変 One more 😒
One more 😒 • 開発組織内でも責務の認識齟齬 ◦ ビジネスロジックを持ちオーケストレーション 層だと思われる • アプリの改修時にもフロントエンドチームの
稼働が発生 • フロントエンドエンジニアがインフラを構築 ・運用管理したり、オブザーバビリティをき ちんとするまでにいたるのには大変 • 今までブラウザサイドの経験しかないメンバ ーでやるのは大変 • BFF という名前が一人歩きしないようにコ ミュニケーションがアーキテクチャ図を作 るべきだった • Web チームがアプリの人を巻き込んで作る べきだった • 初期構築時にインフラエンジニアがチーム にいてほしかった • オブザーバビリティに知見のある人が欲し かった Ideal ✨ BFFパターンの採用 その後
1 2 GraphQLの採用理由 アプリと Web 両方から利用されるため柔軟に利用できるように データオーバーフェッチの削減 リクエストの最適化 クライアントドリブンなアプローチ
Good 👍 GraphQL採用 その後 • ApolloClient のキャッシュが良い ◦ SPA 遷移したときにリフェッチせずキャ
ッシュが優先される • 既存 API の設計に依存し再利用性と柔軟 性が低い ◦ GraphQL のベストプラクティスを実現できていな い。 ◦ 昔の DB のデータ構造や API の改修になしに GraphQL サーバーだけでは柔軟なデータ構造の構 築には至れなかった • REST API と変わらぬ設計 One more 😒
One more 😒 GraphQL採用 その後 • 既存 API の設計に依存し再利用性と柔軟 性が低い
◦ GraphQL のベストプラクティスを実現できていな い。 ◦ 昔の DB のデータ構造や API の改修になしに GraphQL サーバーだけでは柔軟なデータ構造の構 築には至れなかった • REST API と変わらぬ設計 • DB~マイクロサービス まで 1 チームと なりデータ構造を作りたかった • これからのリアーキテクトに期待 Ideal ✨
1 2 3 monorepo の採用理由 SSRと BFF の負荷を分散することで可用性 UP リスク分散
別サーバーにすることで Web サーバーが動かなくとも BFF が動けばアプリは動く 負荷分散 Next.js の API routes だったため、クライアントサイドとサーバーサイドのコードが混在 より明確なコードベースとディレクトリ構造
Good 👍 monorepo 採用 その後 • パフォーマンス向上 • 実際に Web
で障害が発生したが、 BFF は稼働し続けた • クライアントサイドとサーバーサイド でコードベースが分離されてわかりや すく • Web と同じリポジトリの場合に他チーム がカジュアルに参加できない • クライアントとサーバーで util 関数など が共通化できておらず、monorepo の良 さを活かしきれていない One more 😒
One more 😒 monorepo 採用 その後 • Web と同じリポジトリの場合に他チーム がカジュアルに参加できない
• クライアントとサーバーで util 関数など が共通化できておらず、monorepo の良さ を活かしきれていない • 完全な別リポジトリにすべきだった • monorepo での共通関数の modules 作成 を最初にすべきだった Ideal ✨
Before Component ディレクトリの変更 src └─components ├─atoms ├─molecules ├─organisms ├─templates └─pages
1. Atomic design の粒度と React Component の粒度が合わない a. Headless な UI はどうすれば🤔 2. Templates と Layouts が役割が重複してい る a. Pages も同じく One more 😒
After Component ディレクトリの変更 src ├ shared ……………………………… # 特定の機能に関心を持たない汎用モジュール群 │
├ components │ │ ├ functionals ………………… # 見た目に対して関心を持たないコンポーネント群 │ │ └ ui ……………………………… # その他の汎用コンポーネント │ └ hooks ……………………………… # 汎用hooks └ features ……………………………… # 特定の機能に関心を持つモジュール群 ├ shop │ ├ components │ └ hooks └ cart ├ components └hooks
1 2 3 4 改善できる背景 GitHub Discussion や MTG の開催で新しい取り組みへ
前向きに議論 毎週木金に翌週リリースの資材でコア機能のテスト チームでの議論 QA によるリリース判定テスト フロントチームも取り組んでいるがサーバーチームか らも報告がある オブザーバビリティ 自分たちで使って自分たちで直す 社員にユーザーがいる
• チーム内の認識合わせの重要性 • ビジネス変化や考慮不足による負債は不可避 • 改善と組織・環境の重要性 • 新しい取り組みと慎重さのバランス感 まとめ
ありがとうございました! ご質問などお気軽にお尋ねください。😄