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
出前館Webフロントエンドリプレイスプロジェクトの取り組みと反省について
Search
株式会社出前館
November 01, 2023
Technology
1.8k
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 株式会社出前館
中期計画、2回作ってみた ~業務委託と正社員、両方の視点から~
demaecan
1
1.1k
複雑にからみあう複数のシステムを要する出前館QAの実情、展望
demaecan
0
200
QA業務を変える(!?)AIを併用した不具合分析の実践
demaecan
0
210
出前館アプリの品質を支えるリリーストレインとその実践
demaecan
0
250
出前館アプリ進化論 アーキテクチャと組織のリアルな変⾰の舞台裏
demaecan
0
770
Flutterにしてよかった?出前館アプリを2年運用して気づいたことを全部話します
demaecan
1
1.2k
Boxを“使われる場”にする統制と自動化の仕組み
demaecan
1
470
生成AI導入における「短期ROIを超えた」共存戦略
demaecan
0
170
Okta Identity Governanceで実現する最小権限の原則
demaecan
1
490
Other Decks in Technology
See All in Technology
脱金融のフューチャー・デザイン / Future Design Beyond Finance
ks91
PRO
0
150
ヘルスケア領域における AI 活用と その安全性担保のための取り組み (Leveraging AI in Healthcare and Our Efforts to Ensure Its Safety) - Google I/O Extended Tokyo 2026, July 11, 2026
zettaittenani
0
400
ポストモーテム! DDoSからサイトは守れた。 でもビジネスは守れなかった。
bengo4com
1
3.1k
Kaggleで成長するために意識したこと
prgckwb
2
380
インフラと開発の垣根を超えていき!〜元AWSインフラエンジニアがAWS開発で奮闘している話〜
hatahata021
3
260
凡エンジニアがこの先生きのこるためには。〜TypeScript完全に理解したい〜
alchemy1115
2
270
オブザーバビリティ、本当に活用できてる? 〜API連携×生成AIで成熟度を自動評価〜
dmmsre
1
3.3k
Amplify Gen2でbackend.tsにCDKを定義する/しない事によるCDKの挙動の違いとユースケース
smt7174
1
280
2年前に削除したPHPクラスが、 ある日突然決済をエラーにした
ykagano
1
150
“それは自分の仕事じゃない"を越えて行け
yuukiyo
1
400
LLM/Agent評価:トップ営業の発言を「正解」にする 〜暗黙的正解による評価を営業資産に変える〜
takkuhiro
1
230
人を動かすのは時間ではなく、納得感 〜新任EMが入社3ヶ月、組織を2回変えた話〜
kakehashi
PRO
3
260
Featured
See All Featured
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
220
Become a Pro
speakerdeck
PRO
31
6k
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
190
Site-Speed That Sticks
csswizardry
13
1.3k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Speed Design
sergeychernyshev
33
1.9k
Prompt Engineering for Job Search
mfonobong
0
370
Are puppies a ranking factor?
jonoalderson
1
3.7k
Google's AI Overviews - The New Search
badams
0
1.1k
Building the Perfect Custom Keyboard
takai
2
810
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.5k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
650
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 によるリリース判定テスト フロントチームも取り組んでいるがサーバーチームか らも報告がある オブザーバビリティ 自分たちで使って自分たちで直す 社員にユーザーがいる
• チーム内の認識合わせの重要性 • ビジネス変化や考慮不足による負債は不可避 • 改善と組織・環境の重要性 • 新しい取り組みと慎重さのバランス感 まとめ
ありがとうございました! ご質問などお気軽にお尋ねください。😄