SpringBoot & Kotlinを使用してBFF(Backends For Frontends)の実装サンプル
API内部で複数の外部APIをコールする(API-Gateway)
コード
GitHub: bff-sample
本編 基礎編
- Spring BootでREST-API用プロジェクト作成
- Controller作成
- ControllerのUnitTest作成
- Frontend向けのモデル追加
- Repository層で呼び出す外部APIのMockを簡易的にSpringBootで作る
- Repository層の作成
- Repository層のUnitTest作成
- Controllerの単体テストに下位レイヤーのMockを追加する方法
- 2つ目の外部APIを追加
- Service層の追加
- Service層のUnitTest作成
- プロパティファイルの追加(YAML形式)と読み込み
- アプリケーションログのファイル出力
- Infoログの出力
- 定数の追加
- 新規追加 POST APIの実装
- 新規追加 POSTのUnitTest
- 更新 PUTの実装
- 更新 PUTのUnitTest
- 削除 DELETEの実装
- 削除 DELETEのUnitTest
本編 応用編
- RestTemplateにTimeoutを設定する
- RestTemplateのHttpClientをApacheに変更する
- ConnectTimeout/ReadTimeoutのエラーハンドリング
- Spring-RetryでConnectTimeoutのリトライ処理を追加
- Spring-Retryの設定値をプロパティファイルから取得する
- サーバーエラー処理-共通-ネットワークエラー
- Whitelabel-Error対応
外部APIの実装
運用編
- IntelliJでファイル保存時の自動フォーマット設定
- [IntelliJ][Gradle]コードカバレッジの取得方法
- [GitHub Actions]Quickstartを試してみる(Linterの実行)
- [IntelliJ]ktlintの指摘が出ないように設定
- [GitHub Actions]Push時にGradle Buildを実行
- [GitHub Actions]LintとBuildを別のジョブに分けて並列実行する
- [GitHub Actions]UnitTestの成果物の保存と取得
- [GitHub Actions]コードカバレッジの成果物の保存と取得
- [GitHub Actions]ワークフローのステータスバッジをリポジトリ に追加
- Frontend向けのI/FドキュメントとしてREDOCを作成
ハマった箇所
- Spring BootでREST-API用プロジェクト作成 失敗 Javaのバージョンが古い
- intelliJでJUnitの@DisplayNameが表示されない
- ”Unable to use auto-configured MockRestServiceServer since MockServerRestTemplateCustomizer has not been bound to a RestTemplate”の解決
- ”Error while extracting response for type [] and content type [application/json]”の解決
- Gradleのtestタスクをコマンド実行したらJavaのバージョンが低くてFAILEDになった時の対処法
- RestTemplateでコルーチンを使おうとして失敗
- SpringBoot2.3.6でkotlinx-coroutines-coreのversionを1.4.1に指定したら実行時エラー
- コルーチン+WebClientで実行時エラー(ClassNotFoundException)
- [SpringBoot/KotlinでBFF]プロパティ定義した@Valueが読み込まれない
TIPS
- Spring Bootで作ったプロジェクトが依存してるライブラリのバージョン確認
- コルーチンで外部APIを並列的に呼び出してawaitAllで待つ
- [IntelliJ]TDDに便利なショートカットキー(Mac&Win)
- [SpringBoot]RestTemplateでReadTimeoutを意図的に発生させる
- [SpringBoot]RestTemplateでConnectTimeoutを意図的に発生させる
- [SpringBoot]RestTemplateのログを出力する
- Kotlinで変換テーブル
コメントを残す