Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Server-Driven UI入門: 画面のStateを直接受け取るアプローチ

nade
August 22, 2024

Server-Driven UI入門: 画面のStateを直接受け取るアプローチ

【iOSDC2024 day0 19:20 track D】
Server-Driven UI入門: 画面のStateを直接受け取るアプローチ
https://fortee.jp/iosdc-japan-2024/proposal/1f93f00d-02ba-4a5a-8554-c69e7baef816

SwiftUIの登場によって、画面のStateを使ってUIを構築するState-Drivenなアプローチが可能になりました。
クライアントでは、バックエンドからいくつかのAPIをコールし、それらを組み合わせて画面のStateを構成し、SwiftUIのViewに渡すことでUIを表示することができます。

では、画面に一つのAPIで画面のStateをそのまま受け取れる場合、クライアント側にはどのようなロジックが残るでしょうか?
if文やSwitch文のような分岐を持たないアプリは実現できるのでしょうか?

本トークでは、BFF(Backend for Frontend)と呼ばれるクライアント用の中間サーバーを活用し、
可能な限りロジックをバックエンドに寄せたServer-DrivenなUI構築を実務で取り組んだ経験を通して

要件に合わせたResponse構成の工夫
Server-DrivenなUI構築が上手くハマる具体的な事例
といった、クライアントが可能な限りプレゼンテーションロジック以外を持たない構成とその活用について紹介します。

さらに、本トークでは実際にBFFの導入が難しい方に対しても、極端な事例を通じて

どこまでのロジックをバックエンドで持つべきか
バックエンドとのシステム境界をどう考えるべきか
といった疑問への一つの指針を提供します。

nade

August 22, 2024
Tweet

More Decks by nade

Other Decks in Technology

Transcript

  1. Server-Driven UIって? • Server側からUIの構成をそのまま受け取り描画する 「What if clients didn’t need to

    know they were even displaying a listing? 」 クライアント 自身 がリストを表 示 していることさえ知る必要がないとしたら? • 2021年のAirBnbの記事で提案された開発 手 法で話題に 他にもSpotify、Expedia、Lyftなどで導 入 実績 https://github.com/csmets/Server-Driven-UI
  2. そんなあなたにServer-Driven UI • 「施策ごとのUI開発がとにかく 大 変、 バックエンドの変更だけで機能リリースできればなー」 • 「ビジネスロジックの実装がiOSとAndroidでずれちゃう、 保守しやすい管理

    方 法はないだろうか?」 • 「クライアントの設計が複雑で負債化してしまっている、 クライアントのロジック量を減らせないだろうか?」 https://github.com/csmets/Server-Driven-UI
  3. Server-Driven UIのコンセプト 設計思想の中 心 となった3つの発表 ・ 記事を紹介 • WWDC 2

    010 : Building a Server-Driven User Experience • Spotify 20 16 : Backend-driven native UI • AriBnB 20 2 1 : A Deep Dive into Airbnb’s Server-Driven UI System https://github.com/csmets/Server-Driven-UI
  4. Server-Driven UIの歴史① WWDC 2 010 「Building a Server-Driven User Experience

    」で 言 及 • UI Componentのプロパティをそのまま返却して柔軟性をあげよう • コンポーネントのステートを動的に扱うための dataType フィールド https://nonstrict.eu/wwdcindex/wwdc 2 010 / 1 1 7 /
  5. Server-Driven UIの歴史② Spotify 20 16 「Backend-driven native UI 」 •

    クライアントに定義済みのコンポーネントにバックエンドが返すStateを反映 • OSSでおよそ150のコンポーネントとスキーマのセットを公開 https://atscaleconference.com/videos/backend-driven-native-uis/ https://github.com/spotify/HubFramework
  6. Server-Driven UIの歴史③ AirBnB 20 2 1 「A Deep Dive into

    Airbnb’s Server-Driven UI System 」 • すべての機能 ・ 画 面 を表現可能なユニバーサルなスキーマを定義 レイアウト情報を持ったscreensと各UIコンポーネントのステートを持ったsections に統 一 https://medium.com/airbnb-engineering/a-deep-dive-into-airbnbs-server-driven-ui-system- 84 224 4 c 5 f 5
  7. "screens": [ { "id": "ROOT", "layout": { "wide": {}, #

    landscape mode "compact": { # portrait mode "type": "SingleColumnLayout", # ϨΠΞ΢τͷछྨ "main": { "type": "MultipleSectionsPlacement", "sectionDetails": [ # ը໘ཁૉͷsectionIdͷΈ { "sectionId": "hero_section" }, { "sectionId": "title_section" } ] }, } } }, ] layout構成
  8. "sections": [ { "id": "toolbar_section", "sectionComponentType": "TOOLBAR", "section": { "type":

    "ToolbarSection", "nav_button": { "onClickAction": { # λοϓ࣌ͷΞΫγϣϯ "type": "NavigateBack", "screenId": "previous_screen_id" } } } }, { "id": "hero_section", "sectionComponentType": "HERO", "section": { "type": "HeroSection", "images": [ # HeroSectionίϯϙʔωϯτͷStateɺtype͝ͱʹܕ͕ҧ͏ "api.hoge.com/...", ], } }, UI ComponentのState ・ Action
  9. SwiftUI時代のServer-Driven UI 今まで • スキーマ ↔︎ UIコンポーネント間のデータバインディングのコスト • UIコンポーネントごとのStateの設計コスト SwiftUI時代

    • State ↔︎ UI がシームレスに変換可能に • SwiftUI.ViewがそのままUIコンポーネントのStateとして利 用 可能
  10. Server-Driven UIのメリット • リリース不要で変更可能なため 高 速 画 面 構成の変更にアプリの審査やリリースが不要 •

    ビジネスロジックを各プラットフォームで持たない 変更容易性を 高 く保つ システム全体を通じたDRY原則の徹底 • クライアントロジックがコンパクトに 本来の責務であるユーザー体験に集中できる サーバーへのリクエストも 大 幅に減るためパフォーマンス向上にも
  11. Server-Driven UIのデメリット • 事前のUIコンポーネント定義や基盤構築が 大 変 そこに 工 数を割くことのできる 大

    きなチームが取り組んでいる • 膨 大 なUIコンポーネントの組み合わせに対するQAコスト • クライアント-バックエンドの間を埋めるスキルが必要 例)中間サーバーをクライアントエンジニアが書く (Backend for Frontend: BFF) 例)クライアントのUIコンポーネントのStateに責務を持つバックエンド
  12. • 軽量SDUI 軽量DDDのようにすべてのロジックを移譲するわけでなく、システムの運 用 可能性の 高 い ものを移譲する • SDUIの機能の全部はいらないことが多い

    例)同じ機能のレイアウトを頻繁に変えるケースがあるか? • クライアントの特定のロジックのみ移譲する 例)レイアウトはクライアント、コンポーネントのStateを直接JSONで受け取る 軽量Server-Driven UI
  13. タップルの場合 例)タップルにおける重要な品質特性 • モジュール性 カードのフリック、ユーザー検索、メッセージ、ビデオチャットなど機能の幅が広い → Featureごとに移譲するロジックの度合いを決めるべき • 検証容易性 A/B

    Testing 等早い仮説検証を繰り返すことが施策開発において重要 → A/B の分岐が クライアントにある場合(Firebase など)レイアウトはクライアントで決定 • 保守容易性 サービスの特性上クライアント側がボトルネックになったり 手 戻りするケースが多い →ロジックをバックエンドにある程度移譲した 方 が、トータルの保守容易性は下がる
  14. 例)課 金 機能における軽量SDUI • 画 面 のレイアウト情報をクライアントで可変に • 同 一

    のStateで複数種類の画 面 を 表現できるように 軽量Server-Driven UI の実践② ユーザーA ユーザーB 課 金 ViewのState