ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割

Recruit Lifestyle Co., Ltd.
Recruit Lifestyle Co., Ltd.Recruit Lifestyle Co., Ltd.
ホットペッパービューティーにおける
モバイルアプリ向けAPIの

BFF/Backend分割
Nawate Ippei @JJUG 2019 Spring #jjug_ccc #ccc_c4
⾃⼰紹介
• Nawate Ippei
• リクルートライフスタイル
• 2016/04に新卒⼊社
• ⼊社してからずっとホットペッパービューティー
• 仕事内容
• 2016/04 ~ 2018/01 Androidエンジニア
• 2018/01 ~ サーバサイドエンジニア
https://twitter.com/sakuna63
https://github.com/sakuna63
リクルートライフスタイルについて
「ちょっとした毎⽇を提供し、ひとりひとりの⽣活を豊かにする」を
実現するために様々なサービスを提供。
ホットペッパービューティーについて
国内最⼤級のヘアサロン・リラク&ビューティサロンの検索・予約サイト
年間約9800万回の予約が⾏われる(2019/05時点)
今⽇のお話について
• モバイルアプリ向けAPIを2つのAPI層(BFF層/Backend層)に分割した取り組み

についてお話しします
• 現在進⾏系で分割中です 👷 🚧(約100本中、28本のAPIが新構成に移⾏済み)
• 新構成のAPIを利⽤したアプリがつい先⽇(5/13)リリースされました
• なので保守・運⽤の経験に基づいて語れることはほぼありません 🙇
•
アジェンダ
1. BFFとは何か?
2. BFF/Backend分割の⽬的
3. BFF/Backend分割の⽅針
4. BFF/Backendの設計・実装
• API設計
• 技術選定
• ソフトウェア設計・実装
5. BFF/Backend構成の開発体制
6. まとめ
アジェンダ
1. BFFとは何か?
2. BFF/Backend分割の⽬的
3. BFF/Backend分割の⽅針
4. BFF/Backendの設計・実装
• API設計
• 技術選定
• ソフトウェア設計・実装
5. BFF/Backend構成の開発体制
6. まとめ
BFFとは何か?
• BFF = Backends For Frontends
• マイクロサービスアーキテクチャの1つ
• FrontendとAPI Serviceの間に位置するBackendサーバ
• 個々のサービスが提供するAPIを集約し、Frontendに特化したレスポンスを返す
API Service
API Service
API Service
JSON
HTML
CSS, JS
BFF for Web
BFF for App
Search

Engine
Mobile App
Browser
今回のBFFの⽤途:システムの関⼼事の分離
• 表⽰処理を⾏う層(SOE)とデータを管理する層(SOR)の分離
• BFFは前者
• 本発表のBFF/Backend分割はこの⽤途に近い
BFF

(for SOE)
Monolithic
Backend
Backend

(for SOR)
Frontend Frontend
アジェンダ
1. BFFとは何か?
2. BFF/Backend分割の⽬的
3. BFF/Backend分割の⽅針
4. BFF/Backendの設計・実装
• API設計
• 技術選定
• ソフトウェア設計・実装
5. BFF/Backend構成の開発体制
6. まとめ
API開発スピードの⾼速化
BFF/Backend分割の⽬的
背景と課題
• API開発のスピードがアプリ改善スピードのボトルネックになっていたため
• APIの開発はアプリチームからの依頼ベースで実施されるが、

リソース調整などの要因で開発完了まで3ヶ⽉以上かかっていた
• アプリチームの開発サイクルはより早く(1ヶ⽉)、API開発スピードがボトルネックに...
モバイルアプリ

向けAPI
Webアプリ
API開発依頼
開発完了
(3ヶ⽉~後)
アプリチーム(8名) サーバサイドチーム(数⼗名)
モバイルアプリ
課題に対する打ち⼿
BFF層 Backend層
モバイルアプリ向けAPI

(モノリシック)
サーバサイドチーム アプリチーム サーバサイドチーム
分割
APIのBFF/Backend分割を実施し

アプリチームのリソースでAPIを開発・リリースできる体制を整えることで
ボトルネック(API開発スピード)の改善を狙う
アジェンダ
1. BFFとは何か?
2. BFF/Backend分割の⽬的
3. BFF/Backend分割の⽅針
4. BFF/Backendの設計・実装
• API設計
• 技術選定
• ソフトウェア設計・実装
5. BFF/Backend構成の開発体制
6. まとめ
BFF/Backend分割の⽅針
① 各層にどう処理を分担させるか
② 層間の通信をどのように⾏うか
BFF層 Backend層
②どう通信?
モバイルアプリ向けAPI

(モノリシック)
処理A
処理C
処理B
処理D
①どう分担?
?
?
?
?
このように分割することに
BFF層 Backend層
表⽰要件に関わる処理
業務ロジックアプリ特有の処理
データソース(DB等)

のRead/Write
REST API
• BFFにアプリ特有の処理や表⽰要件に関わる処理を持たせる
• BackendはREST APIを提供、BFFは複数のBackend APIを呼び出し結果を集約
BFF層 Backend層モバイルアプリ向けAPI

(モノリシック)
分担
処理A
処理C
処理B
処理D
?
?
?
?
① 各層にどう処理を分担するか? 🤔
処理分担のポイント
• BFFはアプリチームで⾼速に開発できるようにしたい
• 開発(変更)の早さ ≒ 意思決定の早さ(特に⼤きな組織では)
• すばやく意思決定するには

「他チーム・他システムへの依存・影響を⼩さくする」のが⼤事
処理分担のポイント
• BFFはアプリチームで⾼速に開発できるようにしたい
• 開発(変更)の早さ ≒ 意思決定の早さ(特に⼤きな組織では)
• すばやく意思決定するには

「他チーム・他システムへの依存・影響を⼩さくする」のが⼤事
アプリチームで変更の意思決定が完結する処理をBFFに持たせる
処理分担の基準
BFF層 Backend層
表⽰要件に関わる処理
• プレゼンテーションロジック
• 表⽰要件に合わせたデータ集約
業務ロジック
アプリ特有の処理
• アクセストークンの管理など
データソース(DB, 検索エンジン)

のRead/Write
補⾜:表⽰要件に合わせたデータ集約
データA, B, Cを

まとめて表⽰したい!

(表⽰要件)
表⽰要件に合わせて、複数のデータをAPIが⼀つに集約して返すこと
API
A
B
CAPIA B C
APIA B C
集約
モバイルアプリ
• 「予約」「メニュー」「クーポン」を同時に表⽰
• これらは独⽴したデータ
予約⼀覧
予約
予約先サロンのメニューとクーポン
補⾜:表⽰要件に合わせたデータ集約の例
補⾜:表⽰要件に合わせたデータ集約の例
• 「予約」「メニュー」「クーポン」を同時に表⽰
• これらは独⽴したデータ
• APIが↓↓のように集約して返している
予約⼀覧
予約
予約先サロンのメニューとクーポン
"reservations": [
{
"coupons": [
...
],
"menus": [
...
]
}
]
BFF層 Backend層
どう通信?
② 層間でどのように通信するか? 🤔
Backend
BFF/Backend構成におけるデータ集約
• BFFは複数のBackend APIを組み合わせてデータを集約する
• ⾃由に組み合わせられるよう、Backend APIは再利⽤しやすい粒度(REST)で作成
BFF A
B
CAPIA B C
APIA B C
モバイルアプリ
集約
REST API
BFF/Backend分割イメージ - Before
モバイルアプリ向けAPI

(モノリシック)
サーバサイドチーム
アプリチーム
表⽰要件に関わる処理
• プレゼンテーションロジック
• 表⽰要件に合わせたデータ集約
業務ロジック
データソース(DB, 検索エンジン)

のRead/Write
アプリ特有の処理
• アクセストークンの管理など
BFF/Backend分割イメージ - After
サーバサイドチームアプリチーム
BFF層 Backend層
REST API
表⽰要件に関わる処理
• プレゼンテーションロジック
• 表⽰要件に合わせたデータ集約
業務ロジック
データソース(DB, 検索エンジン)

のRead/Write
アプリ特有の処理
• アクセストークンの管理など
分割⽅針の振り返り
処理分担の基準について
• 基本的に、この基準で迷いなく開発できている 👍
• ⼀点悩んだところがあったので次のスライドで紹介
• BFFの開発スピードが早くなるかはこれから検証 🧐(保守・運⽤が始まったばかりなので)
BackendのAPI粒度(REST)について
• 参照系のBackend API(GET)の四分の⼀(24本中6本)がBFF API間で再利⽤できている 👍
• 逆に更新系の Backend API(POST, PUT, DELETE)はBFF APIと1:1で対応することがほとんど
分割⽅針の振り返り
処理分担の基準について
• 基本的に、この基準で迷いなく開発できている 👍
• ⼀点悩んだところがあったので次のスライドで紹介
• BFFの開発スピードが早くなるかはこれから検証 🧐(保守・運⽤が始まったばかりなので)
BackendのAPI粒度(REST)について
• 参照系のBackend API(GET)の四分の⼀(24本中6本)がBFF API間で再利⽤できている 👍
• 逆に更新系の Backend API(POST, PUT, DELETE)はBFF APIと1:1で対応することがほとんど
悩みどころ:プレゼンテーションと業務の境界
• ホットペッパービューティーは掲載システム
• クライアントが⼊稿したデータをユーザに表⽰している
⼊稿システム⼊稿データ掲載 ⼊稿
サロン(クライアント)ユーザ
悩みどころ:プレゼンテーションと業務の境界
• ドメインモデルが表⽰制御のプロパティを持つことがある
• 例えば「値段にチルダ(~)をつけるフラグ」というのがある
• こういったときのテキスト加⼯処理など、どの層に持たせるべきか悩む 🤔
• 、業務ロジックと捉えるべきか...
public class Price {
private int value;
/**
* 値段にチルダ(~)を付けるかどうかのフラグ
*/
private boolean tildaSuffixRequired;
}
悩みどころ:プレゼンテーションと業務の境界
• 結論:「⼊稿ドメインの処理 = 業務処理」と解釈することにしている
• なので、上記に該当する処理はBFF層ではなく、Backend層に持たせている
アジェンダ
1. BFFとは何か?
2. BFF/Backend分割の⽬的
3. BFF/Backend分割の⽅針
4. BFF/Backendの設計・実装
• API設計
• 技術選定
• ソフトウェア設計・実装
5. BFF/Backend構成の開発体制
6. まとめ
API設計
BFF層 Backend層
API粒度 アプリのユースケース単位 REST
APIバージョニング する しない
API設計
BFF層 Backend層
API粒度 アプリのユースケース単位 REST
APIバージョニング する しない
アプリのユースケース単位とは? 🤔
• 右画⾯で⾔う⾚枠の単位
• これらの単位でAPIを作成
ネイルカタログ特集を⾒る
ネイルデザインランキングを⾒る 新着ネイルデザイン

を⾒る
ネイルカラーを⾒る
ネイルテイスト

を⾒る
ネイルシーンを⾒る
画⾯単位で作るとだめなのか? 🤔
• 3
• ⼀度の呼び出しで取得できたほうが

通信回数も少なくなる
• 処理の並列度も下がるのでアプリも楽?
画⾯単位で作る難点
Fault Tolerance観点
• ⼀部の不安定なBackend APIに、BFF API全体のパフォーマンスや成否が引きずられる
アプリからの使いやすさ
• キャッシュ要件の異なるリソースが混ざるときなど、ハンドリングが複雑になる
• etc...
画⾯単位で作る難点
Fault Tolerance観点
• ⼀部の不安定なBackend APIに、BFF API全体のパフォーマンスや成否が引きずられる
アプリからの使いやすさ
• キャッシュ要件の異なるリソースが混ざるときなど、ハンドリングが複雑になる
• etc...
このような事情も踏まえてユースケース単位で作成している
API設計
BFF層 Backend層
API粒度 アプリのユースケース単位 REST
APIバージョニング する しない
RESTにこだわり過ぎないことが⼤事
集約処理をBackend(SQL)でやったほうが圧倒的に楽なときはBackendに任せる
• 異なるリソースまたいだソート + ページネーション処理など
API全体のパフォーマンス影響が⼤きいとき
• API版のN+1問題は必ず避ける(BFFの⽤途に合わせてBackend APIを作る)
• リソースのうち、計算負荷の⾼いプロパティはBFFから任意取得できるようにする
• Backend APIにfieldsパラメータを設けるなど
RESTにこだわり過ぎないことが⼤事
集約処理をBackend(SQL)でやったほうが圧倒的に楽なときはBackendに任せる
• 異なるリソースまたいだソート + ページネーション処理など
API全体のパフォーマンス影響が⼤きいとき
• API版のN+1問題は必ず避ける(BFFの⽤途に合わせてBackend APIを作る)
• リソースのうち、計算負荷の⾼いプロパティはBFFから任意取得できるようにする
• Backend APIにfieldsパラメータを設けるなど
BFFとBackend、互いの歩み寄りが⼤事 💪
API設計
BFF層 Backend層
APIの粒度 アプリの使いやすい粒度 REST
APIバージョニング する しない
BFFのAPIバージョニング
• モバイルアプリ向けAPIは後⽅互換性のサポートが必要
• アプリはユーザがアップデートしない限り、古いバージョンが使われ続ける
• よって、古いバージョンのAPIも使われ続ける可能性がある
• バージョン指定はAcceptヘッダで⾏う⽅式を採⽤
• Accept:application/vnd.hpb-app-BFF.v1.0+json
• バージョンアップは限局分岐(APIごと)で実施
API設計
BFF層 Backend層
APIの粒度 アプリの使いやすい粒度 REST
APIバージョニング する しない
BackendのAPIバージョニング
• バージョニングはしないで、後⽅互換性が壊れるときはBFFと連携して対応する思想
• 社内のシステムから呼ばれるAPIなので、こういった選択肢が取れる
• "後⽅互換性サポートコスト"と"チーム間のコミュニケーションコスト"のトレードオフ
• 組織構成や規模に合わせて選ぶと良い
アジェンダ
1. BFFとは何か?
2. BFF/Backend分割の⽬的
3. BFF/Backend分割の⽅針
4. BFF/Backendの設計・実装
• API設計
• 技術選定
• ソフトウェア設計・実装
5. BFF/Backend構成の開発体制
6. まとめ
技術選定
BFF Backend
⾔語 Kotlin 1.3 AdoptOpenJDK 11
アプリケーションフレームワーク
Sprint Boot2

Spring5系(WebFlux)
Sprint Boot2

Spring5系(WebMVC)
技術選定
BFF Backend
⾔語 Kotlin 1.3 AdoptOpenJDK 11
アプリケーションフレームワーク
Sprint Boot2

Spring5系(WebFlux)
Sprint Boot2

Spring5系(WebMVC)
BFF層の技術選定のポイント
アプリチームのエンジニアが開発する
• できるだけアプリエンジニアの使い慣れた技術を選ぶと良い
BFFは1エンドポイントにつき複数のBackend APIを並列に呼び出す
• I/O待ちが多い
• Non-Blocking I/Oの扱えるフレームワークを選ぶと良さそう
BFFの⾔語選定
• ⾔語はアプリエンジニアの使い慣れたものにしたいのでKotlinかSwiftの⼆択
• サーバサイドSwiftはまだあまり聞かないのでリスキー 😨
• KotlinならサーバサイドJavaの資産を活⽤できる! 🙆
• 組織的にもJava(JVM)の開発・運⽤知⾒が多い 🙆
Kotlinを採⽤!
BFFのフレームワーク選定
• ⾔語はKotlinでフレームワークは実質Spring⼀択で考えた
• ⾔語にこだわらなければnode.jsやGolangも候補だった
• Springは5.0からKotlinを正式にサポート 🙆
• Spring WebFluxならNon-Blocking I/Oのサポートも 🙆
• Spring WebFluxはReactorの学習コストが懸念だが、

AndroidチームがRxJavaを利⽤していたので⼤丈夫そう 🙆
Spring WebFluxを採⽤!
BFFの技術選定の振り返り
• 「ほんとにアプリチームでAPI開発できるのか?」という懸念はあったが、

問題なく開発できそうなことがわかってきている
• ほとんどKotlinとReactorの知識だけで書ける
• Springは下回りさえ整えてしまえば、API実装で意識することはほぼない
• 特にAndroidエンジニアにとってはかなりハードルが低そう
• iOSエンジニアについては要検証...
• 実際Androidエンジニアに実装してもらったが

「これならいけそう」という感想を得ている 👏
BFFの技術選定の振り返り
• Kotlin x Springは違和感なく開発できている 😄
• 「KotlinだからSpringが活かせない」ということは全くない
• 「SpringだからKotlinが活かせない」とういことも全くない
• 個⼈的に気に⼊ってるポイント
• SpringはNonnull/Nullableがしっかりアノテートされているので、

KotlinのNull安全性が活きる 💪
• Spring公式提供の拡張関数群も充実
• 今後は、spring-fu/kofuのようなDSLにも期待
技術選定
BFF Backend
⾔語 Kotlin 1.3 AdoptOpenJDK 11
アプリケーションフレームワーク
Sprint Boot2

Spring5系(WebFlux)
Sprint Boot2

Spring5系(WebMVC)
Backendの技術選定
• あまりこった検討はなし
• Java
• 要員確保の観点
• 組織的にもJavaエンジニアが多い 🙆
• Spring Boot + Sprint WebMVC
• 社内事例のあった技術スタックを素直に採⽤
アジェンダ
1. BFFとは何か?
2. BFF/Backend分割の⽬的
3. BFF/Backend分割の⽅針
4. BFF/Backendの設計・実装
• API設計
• 技術選定
• ソフトウェア設計・実装
5. BFF/Backend構成の開発体制
6. まとめ
ソフトウェアアーキテクチャ
Backend
プレゼンテーション層
ドメイン層
インフラストラクチャ層
アプリケーション層
プレゼンテーション層
ドメイン層
インフラストラクチャ層
アプリケーション層
通常のWebアプリ
プレゼンテーション層
ドメイン層
インフラストラクチャ層
アプリケーション層
BFF
ソフトウェアアーキテクチャ
Backend
プレゼンテーション層
ドメイン層
インフラストラクチャ層
アプリケーション層
プレゼンテーション層
ドメイン層
インフラストラクチャ層
アプリケーション層
通常のWebアプリ
プレゼンテーション層
ドメイン層
インフラストラクチャ層
アプリケーション層
BFF
ソフトウェアアーキテクチャ
Backend
プレゼンテーション層
ドメイン層
インフラストラクチャ層
アプリケーション層
プレゼンテーション層
ドメイン層
インフラストラクチャ層
アプリケーション層
通常のWebアプリ
プレゼンテーション層
ドメイン層
インフラストラクチャ層
アプリケーション層
BFF
APIにおけるプレゼンテーション層の扱い
APIではプレゼンテーション層が薄くなる
• Viewとユーザのインタラクションはないため、そのあたりのハンドリング実装が不要
• APIのView = レスポンスのJSON(or XML)
• Java→Viewの変換はJacksonが担うため、⾃前で実装することはほぼない
プレゼンテーション層はアプリケーション層に統合する形で設計
APIにおけるプレゼンテーション層の扱い
ユースケースの再利⽤性を考慮する必要がない
• APIエンドポイントの単位がユースケースと1:1で対応する
• Controller(プレゼンテーション層)とUsecase(アプリケーション層)を

密結合気味に作ってもデメリットが⼩さい
プレゼンテーション層はアプリケーション層に統合する形で設計
Backendのアプリケーション層実装例
@Usecase
@AllArgsConstructor
public class ReservationUsecase {
/**
* 予約一覧を返却する
*/
@Nonnull
public GetReservationResponse getReservations(...) {
//...
// GetReservationResponse = レスポンス構造を表すレスポンスDTO(View)
// Usecase(アプリケーション層)の時点でViewのインスタンスを返却する
return GetReservationResponse.builder()
.totalCount(count)
.reservations(reservationDtos)
.build();
}
• アプリケーション層の時点でView(Json)と対応するDTOを返す
Backendのアプリケーション層実装例
• ControllerはUsecaseの返り値をResponseEntityにラップして返すだけ
@RestController
@AllArgsConstructor
public class ReservationController {
private final ReservationUsecase usecase;
/**
* 予約一覧を返却する
*/
@GetMapping
public ResponseEntity<GetReservationResponse> getReservations(...) {
final var body = usecase.getReservations();
return ResponseEntity.ok()
.body(body);
}
ソフトウェアアーキテクチャ
Backend
プレゼンテーション層
ドメイン層
インフラストラクチャ層
アプリケーション層
プレゼンテーション層
ドメイン層
インフラストラクチャ層
アプリケーション層
通常のWebアプリ
プレゼンテーション層
ドメイン層
インフラストラクチャ層
アプリケーション層
BFF
BFFのドメイン層とインフラストラクチャ層
ドメイン層
• 業務ロジックがBackendに移譲されるため薄くなる
インフラストラクチャ層
• Backendレスポンス→ドメインモデルの変換が必要ないため薄くなる(後述)
両層ともに薄くなるので1つに統合
BFFにドメインモデルは不要(だと思う)
"ドメインモデル貧⾎症"になりやすい
• BFFには業務ロジックが存在しないため
データモデルとViewの間に作る中間表現としてのメリットが⼩さい
• Backend層:リレーショナルデータモデル(データモデル)→Java(ドメインモデル)→JSON(View)
• BFF層:JSON(データモデル)→Kotlin(ドメインモデル)→JSON(View)の変換
• データモデルの表現⼒(型やデータ構造)が⾼い
• データモデルとViewのインピーダンスミスマッチも⼩さい
BFFのアーキテクチャ
アプリケーション層
• Backendの返すリソースを加⼯し、集約して返す層
ドメイン層
• BackendAPIの呼び出しとリソースの返却を⾏う層
プレゼンテーション層
ドメイン層
インフラストラクチャ層
アプリケーション層
BFF
アプリケーション層 ドメイン層
BFFのアーキテクチャ
Repository
Repository
Repository
Service
Service Backend API
リソース
リソース
リソース
リソース
リソース
リソース
集約結果
集約結果
BFFのドメイン層実装例
• RepositoryはただAPIを呼んで返すだけ
• JSON→Kotlin(DTO)間の変換はすべてJacksonが担う
@Repository
class HairSalonRepository(private val api: HairSalonApi) {
@Cacheable(cacheNames = ["publishing"], key = "'/hair-salons/' + #id")
fun getById(id: String): Mono<HairSalon> = api.getHairSalon(id)
}
BFFのアプリケーション層実装例
fun getMessageBox(userId: String, salonId: String): Mono<HairMessageBox> =
clientSalonRepository.getById(salonId)
.flatMap { clientSalon ->
salonRepository.getById(salonId)
.map { it.toDto() } // サロンが掲載中なら掲載情報を使って返却する
// 非掲載(掲載情報の取得に失敗した)ならサロンボードの登録情報を使って返却する
.onErrorResume { Mono.just(clientSalon.toDto()) }
}
// メッセージの検索と、未読数の取得を行う
.flatMap { messageRepository.getMessagesBySalonId(userId, salonId) }
.map { (salon, response) ->
HairMessageBox(
total = response.total,
salon = salon,
messages = response.messages.map { it.toDto() }
)
}
• Serviceの実装例、複数のAPI(Repository)を呼び出して結果を集約していく
アジェンダ
1. BFFとは何か?
2. BFF/Backend分割の⽬的
3. BFF/Backend分割の⽅針
4. BFF/Backendの設計・実装
• API設計
• 技術選定
• ソフトウェア設計・実装
5. BFF/Backend構成の開発体制
6. まとめ
現在のAPI開発体制
• アプリチームによるBFF層の開発体制構築はこれから
• 現在は層分割を進めてきたメンバがAPIチームとして独⽴
• アプリチームと共にエンハンス案件実施を⾏っている
モバイルアプリ

向けAPI
Webアプリ
アプリチーム(8名) サーバサイドチーム(数⼗名)
モバイルアプリ
Backend API
BFF API
APIチーム
• e.g. Spring Bootのアップデート
• アプリチームにこれを任せるのはスキル的に難しそう
• 技術的なサポート体制構築が必要になる
BFF開発体制構築の課題(1/2)
アーキテクチャレベルの開発課題への対応が難しい
BFFからBackendにかける負荷に変化があるときは、変更を共有する必要がある
• 例えば集約するデータが増える(= Backend APIの呼び出しが増える)とき
Backendチームによるレビュー体制が必要
• 新しいBackend APIを作る必要はないか?
• Backendサーバのスケールアップ/アウトは必要ないか?
BFF開発体制構築の課題(2/2)
Backendにかかる負荷を無視できない
実は今の体制が最適?
• 課題を踏まえると、今の体制が最適なのでは?という気持ちもある
• BFF層の開発オーナーをAPIチームとして

「アプリチームがBFF APIにコミットする⽂化や仕組み」を作るほうが効果的では?
• 模索中...
アプリチーム(8名)
モバイルアプリ
Backend API
BFF API
APIチーム
Pull Request
前提1:BFFの開発は、DBにかかる負荷を気にせず⾏えると嬉しい
前提2:BFFの開発で加わる変更の⼤半は参照系
• 表⽰要件に関するロジックだけをもたせているので
• つまり参照負荷への対策が⾏うことが重要
前提3:BFF/Backend構成はSQLチューニングが難しい
• BackendはREST APIを提供し、BFFはそれを様々な形で組み合わせる
• そのため、BFFからの使い⽅に合わせたSQLチューニングというのは難しい
余談:BFF/Backend構成はリードレプリカのスケールアウトがキモ?
• こういった前提を踏まえると

「参照のためのDBリソースを増やす = リードレプリカのスケールアウト」

がBFF/Backend構成のキモなのではないか?と思える。
• ちなみに、ホットペッパービューティーではOracle DBを利⽤しているため

スケールアウトが難しい 😅(※ インスタンス課⾦のため)
• Backendレスポンスをキャッシュするなど、別の負荷対策が重要になってくる
余談:BFF/Backend構成はリードレプリカのスケールアウトがキモ?
アジェンダ
1. BFFとは何か?
2. BFF/Backend分割の⽬的
3. BFF/Backend分割の⽅針
4. BFF/Backendの設計・実装
• API設計
• 技術選定
• ソフトウェア設計・実装
5. BFF/Backend構成の開発体制
6. まとめ
まとめ
• モノリシックなアプリ向けAPIをBFF層とBackend層に分割しました
• BFF層の分割⽅針/APIの設計・実装はアプリチームの視点で考えることが重要
• BFF層をアプリチームで開発できることは理想だが、現実には難しそう
• 現在模索中...
• 興味がある⽅、ぜひ議論しましょう 💪
WE ARE HIRING
🎉
Ta-da!
You've read everything there is to read.
1 of 82

Recommended

世界一わかりやすいClean Architecture by
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean ArchitectureAtsushi Nakamura
47.1K views77 slides
エンジニアの個人ブランディングと技術組織 by
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織Takafumi ONAKA
23.3K views40 slides
Docker Compose 徹底解説 by
Docker Compose 徹底解説Docker Compose 徹底解説
Docker Compose 徹底解説Masahito Zembutsu
61.1K views123 slides
マイクロにしすぎた結果がこれだよ! by
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!mosa siru
132.6K views32 slides
SPAセキュリティ入門~PHP Conference Japan 2021 by
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021Hiroshi Tokumaru
99.5K views107 slides
WayOfNoTrouble.pptx by
WayOfNoTrouble.pptxWayOfNoTrouble.pptx
WayOfNoTrouble.pptxDaisuke Yamazaki
3.1K views25 slides

More Related Content

What's hot

分散トレーシング技術について(Open tracingやjaeger) by
分散トレーシング技術について(Open tracingやjaeger)分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)NTT Communications Technology Development
23.3K views25 slides
例外設計における大罪 by
例外設計における大罪例外設計における大罪
例外設計における大罪Takuto Wada
68.5K views37 slides
ドメイン駆動設計の正しい歩き方 by
ドメイン駆動設計の正しい歩き方ドメイン駆動設計の正しい歩き方
ドメイン駆動設計の正しい歩き方増田 亨
25.3K views61 slides
マルチテナントのアプリケーション実装〜実践編〜 by
マルチテナントのアプリケーション実装〜実践編〜マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜Yoshiki Nakagawa
4.2K views36 slides
BuildKitによる高速でセキュアなイメージビルド by
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドAkihiro Suda
42.6K views27 slides
マイクロサービス 4つの分割アプローチ by
マイクロサービス 4つの分割アプローチマイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ増田 亨
41.4K views60 slides

What's hot(20)

例外設計における大罪 by Takuto Wada
例外設計における大罪例外設計における大罪
例外設計における大罪
Takuto Wada68.5K views
ドメイン駆動設計の正しい歩き方 by 増田 亨
ドメイン駆動設計の正しい歩き方ドメイン駆動設計の正しい歩き方
ドメイン駆動設計の正しい歩き方
増田 亨25.3K views
マルチテナントのアプリケーション実装〜実践編〜 by Yoshiki Nakagawa
マルチテナントのアプリケーション実装〜実践編〜マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜
Yoshiki Nakagawa4.2K views
BuildKitによる高速でセキュアなイメージビルド by Akihiro Suda
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルド
Akihiro Suda42.6K views
マイクロサービス 4つの分割アプローチ by 増田 亨
マイクロサービス 4つの分割アプローチマイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ
増田 亨41.4K views
AWSのログ管理ベストプラクティス by Akihiro Kuwano
AWSのログ管理ベストプラクティスAWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティス
Akihiro Kuwano77.2K views
Dapr × Kubernetes ではじめるポータブルなマイクロサービス(CloudNative Days Tokyo 2020講演資料) by NTT DATA Technology & Innovation
Dapr × Kubernetes ではじめるポータブルなマイクロサービス(CloudNative Days Tokyo 2020講演資料)Dapr × Kubernetes ではじめるポータブルなマイクロサービス(CloudNative Days Tokyo 2020講演資料)
Dapr × Kubernetes ではじめるポータブルなマイクロサービス(CloudNative Days Tokyo 2020講演資料)
マルチテナント化で知っておきたいデータベースのこと by Amazon Web Services Japan
マルチテナント化で知っておきたいデータベースのことマルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのこと
Redisの特徴と活用方法について by Yuji Otani
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法について
Yuji Otani101.5K views
Dockerからcontainerdへの移行 by Kohei Tokunaga
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
Kohei Tokunaga16.6K views
AWSではじめるMLOps by MariOhbuchi
AWSではじめるMLOpsAWSではじめるMLOps
AWSではじめるMLOps
MariOhbuchi3.2K views
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話 by Koichiro Matsuoka
DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Koichiro Matsuoka88.1K views
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤 by Amazon Web Services Japan
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
Dockerからcontainerdへの移行 by Akihiro Suda
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
Akihiro Suda7.5K views
ドメイン駆動設計 基本を理解する by 増田 亨
ドメイン駆動設計 基本を理解するドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解する
増田 亨117.5K views
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー by Toru Makabe
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャーKubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Toru Makabe37K views
ドメイン駆動設計のためのオブジェクト指向入門 by 増田 亨
ドメイン駆動設計のためのオブジェクト指向入門ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
増田 亨48K views
ドメイン駆動設計のための Spring の上手な使い方 by 増田 亨
ドメイン駆動設計のための Spring の上手な使い方ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
増田 亨138K views

Similar to ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割

LIFFとの連携でさらに強力に。こんなに使えるLINEログイン by
LIFFとの連携でさらに強力に。こんなに使えるLINEログインLIFFとの連携でさらに強力に。こんなに使えるLINEログイン
LIFFとの連携でさらに強力に。こんなに使えるLINEログインNaohiro Fujie
2.2K views29 slides
#decode19 #MW04 誰のための API? Azure デベロッパーにもエンド ユーザーにも嬉しいAPI エコシステム活用アプローチ by
#decode19 #MW04 誰のための API? Azure デベロッパーにもエンド ユーザーにも嬉しいAPI エコシステム活用アプローチ#decode19 #MW04 誰のための API? Azure デベロッパーにもエンド ユーザーにも嬉しいAPI エコシステム活用アプローチ
#decode19 #MW04 誰のための API? Azure デベロッパーにもエンド ユーザーにも嬉しいAPI エコシステム活用アプローチKazuya Sugimoto
2.4K views86 slides
Angular でもっとAPIファースト・もっとモダンデザインなWebアプリケーションを作ろう! by
Angular でもっとAPIファースト・もっとモダンデザインなWebアプリケーションを作ろう!Angular でもっとAPIファースト・もっとモダンデザインなWebアプリケーションを作ろう!
Angular でもっとAPIファースト・もっとモダンデザインなWebアプリケーションを作ろう!CData Software Japan
2.2K views48 slides
Web開発の 今までとこれから by
Web開発の 今までとこれからWeb開発の 今までとこれから
Web開発の 今までとこれからShinichi Takahashi
3.1K views18 slides
[REV UP] あなたならどう使う?最新Azureレシピ for LINE Platform by
[REV UP] あなたならどう使う?最新Azureレシピ for LINE Platform[REV UP] あなたならどう使う?最新Azureレシピ for LINE Platform
[REV UP] あなたならどう使う?最新Azureレシピ for LINE Platform拓将 平林
1.3K views61 slides
20170911 API Meetup Tokyo #21 by
20170911 API Meetup Tokyo #2120170911 API Meetup Tokyo #21
20170911 API Meetup Tokyo #21kounan13
3.1K views76 slides

Similar to ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割(20)

LIFFとの連携でさらに強力に。こんなに使えるLINEログイン by Naohiro Fujie
LIFFとの連携でさらに強力に。こんなに使えるLINEログインLIFFとの連携でさらに強力に。こんなに使えるLINEログイン
LIFFとの連携でさらに強力に。こんなに使えるLINEログイン
Naohiro Fujie2.2K views
#decode19 #MW04 誰のための API? Azure デベロッパーにもエンド ユーザーにも嬉しいAPI エコシステム活用アプローチ by Kazuya Sugimoto
#decode19 #MW04 誰のための API? Azure デベロッパーにもエンド ユーザーにも嬉しいAPI エコシステム活用アプローチ#decode19 #MW04 誰のための API? Azure デベロッパーにもエンド ユーザーにも嬉しいAPI エコシステム活用アプローチ
#decode19 #MW04 誰のための API? Azure デベロッパーにもエンド ユーザーにも嬉しいAPI エコシステム活用アプローチ
Kazuya Sugimoto2.4K views
Angular でもっとAPIファースト・もっとモダンデザインなWebアプリケーションを作ろう! by CData Software Japan
Angular でもっとAPIファースト・もっとモダンデザインなWebアプリケーションを作ろう!Angular でもっとAPIファースト・もっとモダンデザインなWebアプリケーションを作ろう!
Angular でもっとAPIファースト・もっとモダンデザインなWebアプリケーションを作ろう!
[REV UP] あなたならどう使う?最新Azureレシピ for LINE Platform by 拓将 平林
[REV UP] あなたならどう使う?最新Azureレシピ for LINE Platform[REV UP] あなたならどう使う?最新Azureレシピ for LINE Platform
[REV UP] あなたならどう使う?最新Azureレシピ for LINE Platform
拓将 平林1.3K views
20170911 API Meetup Tokyo #21 by kounan13
20170911 API Meetup Tokyo #2120170911 API Meetup Tokyo #21
20170911 API Meetup Tokyo #21
kounan133.1K views
[CTO Night & Day 2019] グローバルのサービス展開に向けたマルチリージョンアーキテクチャ- #ctonight by Amazon Web Services Japan
[CTO Night & Day 2019] グローバルのサービス展開に向けたマルチリージョンアーキテクチャ- #ctonight[CTO Night & Day 2019] グローバルのサービス展開に向けたマルチリージョンアーキテクチャ- #ctonight
[CTO Night & Day 2019] グローバルのサービス展開に向けたマルチリージョンアーキテクチャ- #ctonight
nanapiにおける継続的インテグレーション by 晃 遠山
nanapiにおける継続的インテグレーションnanapiにおける継続的インテグレーション
nanapiにおける継続的インテグレーション
晃 遠山11.7K views
プログラム組んだら負け!実はHTML/CSSだけでできること2015夏 by Yusuke Hirao
プログラム組んだら負け!実はHTML/CSSだけでできること2015夏プログラム組んだら負け!実はHTML/CSSだけでできること2015夏
プログラム組んだら負け!実はHTML/CSSだけでできること2015夏
Yusuke Hirao82.1K views
PEP x LINE WORKS Introduction by YuIkarashi
PEP x LINE WORKS IntroductionPEP x LINE WORKS Introduction
PEP x LINE WORKS Introduction
YuIkarashi178 views
AppPotモバイルアプリ開発『内製化』 by Ryohei Sogo
AppPotモバイルアプリ開発『内製化』AppPotモバイルアプリ開発『内製化』
AppPotモバイルアプリ開発『内製化』
Ryohei Sogo1.4K views
第1回プログラミング大学in福岡 by Ryu Yamashita
第1回プログラミング大学in福岡第1回プログラミング大学in福岡
第1回プログラミング大学in福岡
Ryu Yamashita825 views
The Fastest Possible Way to Develop an Interactive App by LINE Corporation
The Fastest Possible Way to Develop an Interactive AppThe Fastest Possible Way to Develop an Interactive App
The Fastest Possible Way to Develop an Interactive App
LINE Corporation806 views
Java クライント実装におけるAPIスタイル頂上決戦! 野良REST vs GraphQL vs OData vs OpenAPI (Swagger) by Kazuya Sugimoto
Java クライント実装におけるAPIスタイル頂上決戦! 野良REST vs GraphQL vs OData vs OpenAPI (Swagger)Java クライント実装におけるAPIスタイル頂上決戦! 野良REST vs GraphQL vs OData vs OpenAPI (Swagger)
Java クライント実装におけるAPIスタイル頂上決戦! 野良REST vs GraphQL vs OData vs OpenAPI (Swagger)
Kazuya Sugimoto4.5K views
iQONの開発手法 at iQONエンジニアセミナー by Imamura Masayuki
iQONの開発手法 at iQONエンジニアセミナーiQONの開発手法 at iQONエンジニアセミナー
iQONの開発手法 at iQONエンジニアセミナー
Imamura Masayuki4.9K views

More from Recruit Lifestyle Co., Ltd.

業務と消費者の体験を同時にデザインするリクルートの価値検証のリアル ー 「Airレジ ハンディ」セルフオーダーのブレない「価値」の確かめ方 ー by
業務と消費者の体験を同時にデザインするリクルートの価値検証のリアル ー 「Airレジ ハンディ」セルフオーダーのブレない「価値」の確かめ方 ー業務と消費者の体験を同時にデザインするリクルートの価値検証のリアル ー 「Airレジ ハンディ」セルフオーダーのブレない「価値」の確かめ方 ー
業務と消費者の体験を同時にデザインするリクルートの価値検証のリアル ー 「Airレジ ハンディ」セルフオーダーのブレない「価値」の確かめ方 ーRecruit Lifestyle Co., Ltd.
2.7K views56 slides
分散トレーシングAWS:X-Rayとの上手い付き合い方 by
分散トレーシングAWS:X-Rayとの上手い付き合い方分散トレーシングAWS:X-Rayとの上手い付き合い方
分散トレーシングAWS:X-Rayとの上手い付き合い方Recruit Lifestyle Co., Ltd.
3.2K views71 slides
OOUIを実践してわかった、9つの大切なこと by
OOUIを実践してわかった、9つの大切なことOOUIを実践してわかった、9つの大切なこと
OOUIを実践してわかった、9つの大切なことRecruit Lifestyle Co., Ltd.
8.2K views63 slides
CTIサービスを支える裏側 〜物理デバイスとの戦い〜 | iOSDC Japan 2020 by
CTIサービスを支える裏側 〜物理デバイスとの戦い〜 | iOSDC Japan 2020CTIサービスを支える裏側 〜物理デバイスとの戦い〜 | iOSDC Japan 2020
CTIサービスを支える裏側 〜物理デバイスとの戦い〜 | iOSDC Japan 2020Recruit Lifestyle Co., Ltd.
2.6K views36 slides
「進化し続けるインフラ」のためのマルチアカウント管理 by
「進化し続けるインフラ」のためのマルチアカウント管理「進化し続けるインフラ」のためのマルチアカウント管理
「進化し続けるインフラ」のためのマルチアカウント管理Recruit Lifestyle Co., Ltd.
2.3K views46 slides
Air事業のデザイン組織とデザイナー by
Air事業のデザイン組織とデザイナーAir事業のデザイン組織とデザイナー
Air事業のデザイン組織とデザイナーRecruit Lifestyle Co., Ltd.
2.9K views35 slides

More from Recruit Lifestyle Co., Ltd.(20)

業務と消費者の体験を同時にデザインするリクルートの価値検証のリアル ー 「Airレジ ハンディ」セルフオーダーのブレない「価値」の確かめ方 ー by Recruit Lifestyle Co., Ltd.
業務と消費者の体験を同時にデザインするリクルートの価値検証のリアル ー 「Airレジ ハンディ」セルフオーダーのブレない「価値」の確かめ方 ー業務と消費者の体験を同時にデザインするリクルートの価値検証のリアル ー 「Airレジ ハンディ」セルフオーダーのブレない「価値」の確かめ方 ー
業務と消費者の体験を同時にデザインするリクルートの価値検証のリアル ー 「Airレジ ハンディ」セルフオーダーのブレない「価値」の確かめ方 ー
CTIサービスを支える裏側 〜物理デバイスとの戦い〜 | iOSDC Japan 2020 by Recruit Lifestyle Co., Ltd.
CTIサービスを支える裏側 〜物理デバイスとの戦い〜 | iOSDC Japan 2020CTIサービスを支える裏側 〜物理デバイスとの戦い〜 | iOSDC Japan 2020
CTIサービスを支える裏側 〜物理デバイスとの戦い〜 | iOSDC Japan 2020
「進化し続けるインフラ」のためのマルチアカウント管理 by Recruit Lifestyle Co., Ltd.
「進化し続けるインフラ」のためのマルチアカウント管理「進化し続けるインフラ」のためのマルチアカウント管理
「進化し続けるインフラ」のためのマルチアカウント管理
データサイエンティストが力を発揮できるアジャイルデータ活用基盤 by Recruit Lifestyle Co., Ltd.
データサイエンティストが力を発揮できるアジャイルデータ活用基盤データサイエンティストが力を発揮できるアジャイルデータ活用基盤
データサイエンティストが力を発揮できるアジャイルデータ活用基盤
The Design for Serverless ETL Pipeline データ分析基盤のレガシーなデータロードをサーバレスでフルリプレースするまで道のり by Recruit Lifestyle Co., Ltd.
The Design for Serverless ETL Pipeline データ分析基盤のレガシーなデータロードをサーバレスでフルリプレースするまで道のりThe Design for Serverless ETL Pipeline データ分析基盤のレガシーなデータロードをサーバレスでフルリプレースするまで道のり
The Design for Serverless ETL Pipeline データ分析基盤のレガシーなデータロードをサーバレスでフルリプレースするまで道のり
リクルートライフスタイルにおける深層学習の活用とGCPでの実現方法 by Recruit Lifestyle Co., Ltd.
リクルートライフスタイルにおける深層学習の活用とGCPでの実現方法リクルートライフスタイルにおける深層学習の活用とGCPでの実現方法
リクルートライフスタイルにおける深層学習の活用とGCPでの実現方法
データサイエンティストとエンジニア 両者が幸せになれる機械学習基盤を求めて by Recruit Lifestyle Co., Ltd.
データサイエンティストとエンジニア 両者が幸せになれる機械学習基盤を求めてデータサイエンティストとエンジニア 両者が幸せになれる機械学習基盤を求めて
データサイエンティストとエンジニア 両者が幸せになれる機械学習基盤を求めて

Recently uploaded

SSH超入門 by
SSH超入門SSH超入門
SSH超入門Toru Miyahara
207 views21 slides
how query cost affects search behavior translated in JP by
how query cost affects search behavior translated in JPhow query cost affects search behavior translated in JP
how query cost affects search behavior translated in JPTobioka Ken
9 views16 slides
3Dプリンタでロボット作るよ#1_黎明編 by
3Dプリンタでロボット作るよ#1_黎明編3Dプリンタでロボット作るよ#1_黎明編
3Dプリンタでロボット作るよ#1_黎明編Yoshihiro Shibata
20 views7 slides
AIで始めるRustプログラミング #SolDevHub by
AIで始めるRustプログラミング #SolDevHubAIで始めるRustプログラミング #SolDevHub
AIで始めるRustプログラミング #SolDevHubK Kinzal
21 views25 slides
Najah Matsuo Self Introduction by
Najah Matsuo Self IntroductionNajah Matsuo Self Introduction
Najah Matsuo Self IntroductionNajahMatsuo
7 views29 slides
図解で理解するvetKD by
図解で理解するvetKD図解で理解するvetKD
図解で理解するvetKDryoo toku
85 views22 slides

Recently uploaded(10)

how query cost affects search behavior translated in JP by Tobioka Ken
how query cost affects search behavior translated in JPhow query cost affects search behavior translated in JP
how query cost affects search behavior translated in JP
Tobioka Ken9 views
3Dプリンタでロボット作るよ#1_黎明編 by Yoshihiro Shibata
3Dプリンタでロボット作るよ#1_黎明編3Dプリンタでロボット作るよ#1_黎明編
3Dプリンタでロボット作るよ#1_黎明編
AIで始めるRustプログラミング #SolDevHub by K Kinzal
AIで始めるRustプログラミング #SolDevHubAIで始めるRustプログラミング #SolDevHub
AIで始めるRustプログラミング #SolDevHub
K Kinzal21 views
Najah Matsuo Self Introduction by NajahMatsuo
Najah Matsuo Self IntroductionNajah Matsuo Self Introduction
Najah Matsuo Self Introduction
NajahMatsuo7 views
図解で理解するvetKD by ryoo toku
図解で理解するvetKD図解で理解するvetKD
図解で理解するvetKD
ryoo toku85 views
onewedge_companyguide1 by ONEWEDGE1
onewedge_companyguide1onewedge_companyguide1
onewedge_companyguide1
ONEWEDGE17 views

ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割