小さな改修を公開可能な技術知見へ変える進め方

2026年6月15日から2026年6月21日のワークログを見直すと、この事例では単一の大機能を完成させた週ではなく、複数の小さな改修を「後から説明できる形」にそろえた週だった。対象は、Angular 製の学習用アプリ angular-tutorial、Spring Cloud Gateway を使った API 集約リポジトリ api-gateway、DTO 変換方式を検証する Spring Boot サンプル demo、そして Markdown ベースの技術ブログである。

共通していたのは、実装だけで終わらせず、どの層を変えたのか、何を確認できていて何が未確認なのかまで残したことだ。この記事では、検索 UI 追加、Gateway の耐障害化、DTO マッピング検証、そしてそれらを公開可能なワークログへ載せる運用を、ひとつの開発知見として整理する。

この記事で解決すること

小さな改修が複数ある週は、羅列すると散らかるが、責務分離という軸で読むと再利用できる知見になる。この記事では、次の悩みを解く。

  • UI、Gateway、DTO 変換の小さな変更を、共通の設計観点で整理したい。
  • 成功した検証と失敗した検証を同じ記事内で正直に扱いたい。
  • 作業ログを、単なる進捗報告ではなく次の実装判断に使える形へ変えたい。

実施した改善

この事例では大きく4つの変更を進めた。angular-tutorial では社員検索コンポーネントを追加し、入力イベントを間引きながら詳細画面へ遷移できる UI を組み込んだ。api-gateway では Spring Cloud Gateway に Circuit Breaker と Swagger 集約ルートを追加し、障害時の退避経路と API ドキュメントの入口を Gateway 側へ寄せた。demo では Controller DTO から Service DTO への変換を Dozer で簡略化できるかを試し、設定配置とビルド互換性の課題を洗い出した。あわせてブログ側では、これらの変更を日次ワークログとして _data/blog に取り込み、週次で読み手向けの知見へ再構成する流れを固めた。

対象 変更内容 確認できたこと 残ったこと
angular-tutorial 検索 UI と検索サービスを追加 npm run build 通過 E2E と失敗時 UI
api-gateway Circuit Breaker、Actuator、Swagger 集約を追加 ./mvnw -q -DskipTests compile 通過 ルート整合性と実疎通
demo Dozer による DTO 変換を試作 差分の意図を整理 JDK/Gradle 不整合解消
ブログ側 日次 Worklog と週次記事の下書き運用を整備 content validation 通過 表示確認の軽量化

確認できた成果

成果は、機能追加、耐障害化、設計検証、記録運用という性質の違う作業を、同じ観点で比較できるようになったことだ。特に「実装できたか」だけでなく、「ビルドまでは確認した」「テストは未整備」「本番反映は未実施」のように確認段階を分けて残せた点が大きい。これにより、後日続きを再開するときに、コードを読み直す前から作業の位置づけをつかみやすくなった。

もう一つの成果は、ブログ側への取り込み運用を通じて、小さな改修をそのまま日報で終わらせず、他の開発者が再利用できる説明へ変換する型が見えたことだ。この事例の変更はまだデプロイやリリース完了まで届いていないものが多いが、逆に言えば「途中段階の変更をどう公開知に変えるか」という運用の土台は前進した。

判断と進め方

最初に整理したのは、変更の粒度だった。6月16日のワークログには、Angular の UI 追加、Spring Gateway の運用改善、Spring Boot の DTO マッピング試作という別々の題材が混在していた。そのまま並べると散漫に見えるが、いずれも「既存アプリへ小さな改善を追加し、静的確認やビルド確認まで進めたが、運用段階の確認は残っている」という共通構造を持っていた。

その後の 6月18日から 6月20日 では、ブログ側 に日次ワークログを追加しながら、その共通構造を崩さずに記録する方法を整えた。dry-run で草稿を作り、BlogPost frontmatter に合わせて整形し、node scripts/validate-content.js で最低限の整合性を確認する流れを回したことで、アプリ改修と記録運用を切り離さずに扱えるようになった。

flowchart TD
  A["実装差分の確認"] --> B["ビルド・検証の実行"]
  B --> C["未確認事項の切り分け"]
  C --> D["ブログリポジトリ の日次 Worklog 化"]
  D --> E["週次ナレッジ記事へ再構成"]

使った技術

アプリ改修側で使った技術は明確に分かれている。angular-tutorial では Angular 4 系、RxJS、HttpModuleangular-in-memory-web-api を使い、入力イベントのデバウンスと検索 API 呼び出しを組み合わせた。api-gateway では Spring Cloud Gateway Server MVC、Resilience4j、Spring Boot Actuator、Springdoc Swagger UI を使い、業務ルートの前段で耐障害化と API ドキュメント集約を行った。demo では Spring Boot、Lombok、Dozer を使い、Controller 層 DTO と Service 層 DTO の変換責務を分離しようとした。

記録運用側では、ブログ側 が Gatsby 2 系、gatsby-source-filesystemgatsby-transformer-remark を使って _data/blog 配下の Markdown を取り込む。ここでは worklog-blogger という、Codex のセッションログとローカル作業履歴から worklog 草稿を生成する自作スキルを情報収集の入口として使ったが、主役はあくまで変更対象リポジトリ側の実装と、その内容を受け止めるブログ側のコンテンツ構造だった。

テストとビルドの観点では、Angular 側は npm run build、Gateway 側は ./mvnw -q -DskipTests compile、ブログ側は node scripts/validate-content.js を回している。demo./gradlew testUnsupported class file major version 65 で失敗しており、ここだけは検証基盤の整備が先に必要だと分かった。

構成

この事例の変更をアーキテクチャで捉えると、「画面層」「API 集約層」「変換責務の境界」「公開コンテンツ層」の4点に分かれる。Angular の検索機能はダッシュボード配下へ小さな UI を足し、検索処理はサービスへ分離した。Gateway ではルーティング定義と耐障害化をエッジ側へ寄せ、下流サービスの変更を増やさない構成を取った。demo は Controller と Service の DTO を分けて、変換をライブラリへ委譲するかを試している。ブログ側はこれらの変更を _data/blog/*.md として保持し、Gatsby 側で記事へ変換する。

flowchart LR
  UI["Angular UI層<br/>member-search"] --> API["検索API / 既存詳細画面"]
  GW["Spring Cloud Gateway"] --> SVC["下流サービス群"]
  DTO["Controller DTO"] --> MAP["Dozer / 手動マッピング"]
  MAP --> APP["Service DTO"]
  LOG["ブログリポジトリ Worklog"] --> SITE["Gatsby 記事化"]

この週で重要だったのは、どの変更も責務の置き場所を明確にしようとしていたことだ。検索ロジックを UI コンポーネントへ閉じ込めずサービスへ逃がす、障害対策を各サービスでなく Gateway に集約する、DTO 変換を Controller に書き散らさず外出しする、記録をチャットログのまま残さずブログの frontmatter 契約に載せる。技術は違っても、責務分離という軸は一貫していた。

採用理由と代替案

Angular 側で SubjectdebounceTime を使ったのは、検索要求を毎キー入力ごとに発火させず、古い Angular 構成でも最小差分で検索 UI を足せるからだ。別画面を新設せずダッシュボードへ埋め込んだのも、既存導線を保ったまま詳細画面へのショートカットを増やしたかったためである。

Gateway 側で Circuit Breaker を Gateway 層に置いた理由は、下流サービスごとに個別の防御を作るより、入口で一貫したフォールバックを持たせた方が保守しやすいからだ。Swagger 集約も同様で、利用者に複数サービスの API 定義を単一入口で見せる方が運用負荷を下げられる。demo で Dozer を試した理由は、手動コピー増加による保守負荷を減らしたいからだが、同時に型安全性やビルド時検証の弱さも露出したため、Dozer 継続が最適かは再評価が必要になった。

ブログ側で既存の BlogPost frontmatter をそのまま使ったのは、新しいテンプレートや表示ロジックを増やさずに記事を追加できるからだ。日次ログ生成に dry-run を挟む方針も、秘密情報やローカル依存情報、未解決プレースホルダを保存前に落とせるため妥当だった。つまりこの事例の技術選定は、新規性よりも「既存構成に小さく安全に乗せる」ことを優先していた。

検証結果

確認した観点は、複数の小改修を責務分離という観点で比較し、成功した確認と失敗した確認を分けて記録した点にある。確認した主なコマンドは次の通り。

npm run build
./mvnw -q -DskipTests compile
node scripts/validate-content.js
./gradlew test  # Unsupported class file major version 65 で失敗

失敗した Gradle 検証も隠さず、DTO 変換基盤の整備が残課題であることを記事内に残した。

導入手順

この事例の流れを再利用可能な導入手順として書くと、次の順で進めると扱いやすい。

  1. 既存の画面、API、DTO、コンテンツ構成のどこを変えるのかを先に特定する。
  2. UI 変更ならコンポーネントとサービス、Gateway 変更ならルーティングと設定、DTO 変更なら変換責務、ブログ追加なら frontmatter 契約というように、責務ごとに改修点を分ける。
  3. 実装後は対象に合った最小の確認をすぐ回す。今週で言えば npm run build./mvnw -q -DskipTests compilenode scripts/validate-content.js がそれに当たる。
  4. 失敗した確認は「実装失敗」ではなく「検証基盤の課題」として切り出す。demo の Gradle/JDK 不整合はこの扱いにした。
  5. 変更内容、検証結果、未確認事項を日次 Worklog へ残し、週次では共通する判断軸を抜き出して知見化する。
手順 実装対象 この事例の具体例
変更点を絞る 画面/API/DTO/コンテンツ 検索 UI、Gateway、Dozer、Worklog
責務を分けて実装 UI とサービス、Gateway と下流、DTO と変換、記事と表示契約 member-search.service.tsRoutes.javaControllerForm_data/blog/*.md
最小確認を回す build / compile / validation npm、Maven Wrapper、content validation
未確認事項を残す 実疎通、E2E、デプロイ、リリース Swagger 表示、例外 UI、Gradle 修正
週次で再構成する 記録を知見へ変換 本記事

この事例ではデプロイやリリース完了まで進んだ変更は確認できていない。そのため導入手順としては、反映前に「実疎通確認」「環境差分確認」「リリース後の動作確認」を明示的に追加するのが次の段階になる。

制約と残課題

課題は、どの変更も「差分は小さいが、確認不足のままでは終われない」点に集約されていた。Angular の検索機能では、ビルドは通っても空結果やエラー時の UX が未整備だった。Gateway では compile は通っても Swagger 集約ルート名と設定値の整合、Circuit Breaker の実フォールバック動作が未確認だった。demo では発想自体は妥当でも、Gradle と JDK の不整合で自動テストまで進めなかった。

記録運用側にも別の課題があった。自動生成された草稿は、そのままだと対象アプリの説明が薄く、対象アプリ のような抽象的な文面が残りやすい。そこでブログ側へ書き込む前に、対象リポジトリ名、構成、確認コマンド、未完了事項を手で具体化する工程が必要だった。公開向けナレッジにするなら、この最後の編集工程はまだ自動化し切らない方が品質を保ちやすい。

次の改善候補

  • angular-tutorial に検索 0 件表示と API 失敗時 UI を追加し、検索から詳細遷移までの E2E を用意する。
  • api-gateway の Swagger 集約 URL と Route 定義の整合性を取り、Circuit Breaker の open/half-open/closed を再現する統合テストを足す。
  • demo は Dozer を継続するか、MapStruct のようなビルド時検証しやすい方式へ切り替えるかを比較し、先に Gradle と JDK の互換性を直す。
  • ブログ側では content validation に加えて、ドラフト記事だけを対象にした軽量な表示確認フローを作る。
  • 草稿生成スキルの草稿生成では、未解決プレースホルダや公開に向かないローカル情報を検出して警告する仕組みを追加する。
Back to posts

© 2026 KenRp BlogKenRpの個人技術メモ