6 会計 freee の基本的な構成 主に今回注目している部分について 会計 freee Rails App Web フロント Private API Controller Service モバイル アプリ 3rd Party Client Public API Controller Admin Controller Model 銀行等 人事労務 freee Rails App マイクロサービス
7 会計 freee の基本的な構成 ある1つの機能について、各チームの担当領域 会計 freee Rails App Web フロント Private API Controller Service モバイル アプリ 3rd Party Client Public API Controller Admin Controller Model 銀行等 人事労務 freee Rails App マイクロサービス 会計チーム モバイルチーム API チーム いくつかの チーム
● Backend API というものを新しく定義して導入する ● Controller などは Backend API を利用する立場と定義する ● Backend API の内側をモジュラモノリスにおけるモジュールと定義する ● この単位でモジュラモノリス化を進めていく 15 会計 freee ではどうするか 会計 freee Rails App Module Model Service Controller API
● ある機能に属するテーブルに対応する ActiveRecord Model は、その機能の Backend API を実装する Service 内でだけ使用可能 ● 機能をまたいで ActiveRecord Model の関連を作らない ● ある機能Aの Backend Service 内部から別の機能Bに属するテーブルを読み書きす る場合は、Bの Backend Service を経由する ● (超汎用的なテーブルなど例外はある) 17 Backend API と共に導入する制約
18 Backend API と共に導入する制約 ある機能に属するテーブルに対応する ActiveRecord Model は、 その機能の Backend API を実装する Service 内でだけ使用可能 会計 freee Rails App 機能 A Model A Service A 機能 B Service B これもダメ Controller これはダメ
19 Backend API と共に導入する制約 機能をまたいで ActiveRecord Model の関連を作らない 会計 freee Rails App 機能 B Service B 機能 A Model A1 Service A Model A2 Model A3 Model B1 Model B2 これはダメ
20 Backend API と共に導入する制約 ある機能Aの Backend Service 内部から別の機能Bに属するテーブルを読み書きする場合 は、Bの Backend Service を経由する 会計 freee Rails App 機能 A Model A1 Service A Model A2 Model A3 機能 B Service B Model B1 Model B2 OK API B
● Private API を Web フロントエンドとモバイルアプリ両方から利用していたのをやめる ● モバイルアプリ向けに Mobile API を新設する ● 各チームが Controller のオーナーになり、他チームに影響を与えずに Web API を変 更していけるようにするため 22 Backend API と一緒に行う変更
23 Mobile API を新設 会計 freee Rails App 機能 A Model A1 Service A Model A2 Model A3 Web フロント モバイル アプリ 3rd Party Client Private API Controller Public API Controller Admin Controller API A
24 Mobile API を新設 会計 freee Rails App 機能 A Model A1 Service A Model A2 Model A3 Web フロント モバイル アプリ 3rd Party Client Private API Controller Public API Controller Admin Controller Mobile API Controller API A
25 Mobile API を新設 会計チーム モバイルチーム 会計 freee Rails App いくつかの チーム 機能 A Model A1 Service A Model A2 Model A3 Web フロント モバイル アプリ 3rd Party Client Private API Controller Public API Controller API チーム Admin Controller Mobile API Controller API A
26 Backend API 導入後の図 会計 freee Rails App 機能 B Service B 機能 A Model A1 Service A Model A2 Model A3 Model B1 Model B2 Web フロント モバイル アプリ 3rd Party Client Private API Controller Public API Controller Admin Controller Mobile API Controller API A API B Controller が Service A に直接依存しないように描かれているが、API A の存在を強調するためにそう描いているだけで実際には Service A に 直接依存する。A から B についても同様。実際の構成要素のうち説明に関係のないものは省いている。
● Service 実装より前にインタフェースを作ることになるため、Service 実装中でもモバ イルアプリや Public API を並行で作れるようになる ○ これを行いたいのが発端だった ● 機能実装の影響範囲がはっきりする ● Web API の変更が各チーム内で完結する 27 Backend API 導入でどう良くなるか