# Spring Boot 3.5.6 → 3.5.16 バージョンアップ作業手順
## 1. 目的
Spring Bootを3.5.6から3.5.16へ更新し、依存関係、ビルド、単体テスト、Spring ApplicationContext、各Profileおよびステージング環境で問題がないことを確認する。
## 2. 対象作業
以下を実施する。
1. Spring Bootのバージョンのみを3.5.16へ変更する
2. 3.5.6と3.5.16の依存関係ツリーを比較する
3. コンパイルと単体テストを実行する
4. Spring Context起動テストを実行する
5. 全Profileで起動確認する
6. ステージング環境で回帰テストを実施する
---
## 3. 事前準備
### 3.1 作業ブランチの作成
現在の対象ブランチを最新化する。
git switch <対象ブランチ>
git pull
バージョンアップ用ブランチを作成する。
git switch -c upgrade/spring-boot-3.5.16
### 3.2 現行バージョンの確認
Mavenの場合:
./mvnw help:effective-pom
./mvnw dependency:tree
Gradleの場合:
./gradlew dependencies
./gradlew buildEnvironment
以下を確認する。
* Spring Bootが3.5.6であること
* Javaバージョン
* MavenまたはGradleのバージョン
* Spring Boot管理外で固定している依存ライブラリ
* 使用しているProfile
* ステージング環境の起動方法
* 外部設定ファイル、環境変数、JVMオプション
### 3.3 現行バージョンのテスト
変更前の3.5.6で、既存テストが成功することを確認する。
Mavenの場合:
```bash
./mvnw clean test
Gradleの場合:
./gradlew clean test
変更前から失敗しているテストがある場合は、バージョンアップによる失敗と区別できるよう記録する。
### 3.4 現行依存関係ツリーの保存
Mavenの場合:
```bash
./mvnw dependency:tree \
-Dverbose \
-DoutputFile=dependency-tree-3.5.6.txt
Gradleの場合:
./gradlew dependencies \
> dependency-tree-3.5.6.txt
必要に応じて、主要Configuration単位でも保存する。
./gradlew dependencies \
--configuration runtimeClasspath \
> runtime-classpath-3.5.6.txt
./gradlew dependencies \
--configuration testRuntimeClasspath \
> test-runtime-classpath-3.5.6.txt
### 完了条件
* 変更前のビルド結果が記録されている
* 変更前のテスト結果が記録されている
* 3.5.6の依存関係ツリーが保存されている
* 使用Profileと起動方法が整理されている
---
## 4. Spring Bootのバージョン変更
Spring Bootのバージョンだけを3.5.16へ変更する。
この段階では、他の依存ライブラリやアプリケーションコードを同時に変更しない。
### 4.1 Mavenの場合
Spring Boot Parentを利用している場合:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.5.16</version>
<relativePath/>
</parent>
BOMを利用している場合:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>3.5.16</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
Spring Boot Maven Pluginのバージョンを明示している場合も確認する。
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>3.5.16</version>
</plugin>
### 4.2 Gradleの場合
Plugins DSLの場合:
plugins {
id 'org.springframework.boot' version '3.5.16'
}
Kotlin DSLの場合:
plugins {
id("org.springframework.boot") version "3.5.16"
}
Version Catalogや共通ビルド設定で管理している場合は、管理元の値を変更する。
### 4.3 変更内容の確認
git diff
Spring Bootのバージョン以外が変更されていないことを確認する。
### 完了条件
* Spring Bootのバージョンが3.5.16になっている
* 不要な依存ライブラリ更新が含まれていない
* アプリケーションコードの変更が含まれていない
---
## 5. 依存関係ツリーの比較
### 5.1 3.5.16の依存関係ツリーを保存
Mavenの場合:
./mvnw dependency:tree \
-Dverbose \
-DoutputFile=dependency-tree-3.5.16.txt
Gradleの場合:
./gradlew dependencies \
> dependency-tree-3.5.16.txt
必要に応じてConfiguration単位でも保存する。
./gradlew dependencies \
--configuration runtimeClasspath \
> runtime-classpath-3.5.16.txt
./gradlew dependencies \
--configuration testRuntimeClasspath \
> test-runtime-classpath-3.5.16.txt
### 5.2 差分を取得
Mavenの場合:
diff -u \
dependency-tree-3.5.6.txt \
dependency-tree-3.5.16.txt \
> dependency-tree-diff.txt
Gradleの場合:
diff -u \
runtime-classpath-3.5.6.txt \
runtime-classpath-3.5.16.txt \
> runtime-classpath-diff.txt
Windowsでは、Git Bashの`diff`またはIDEの比較機能を使用する。
### 5.3 確認対象
特に以下を確認する。
* Spring Framework
* Spring Security
* Spring Data
* Hibernate ORM
* Jackson
* Tomcat、Jetty、Undertow
* Netty
* Reactor
* Micrometer
* Logback
* Spring Kafka
* Spring AMQP
* DBドライバー
* Flyway
* Liquibase
* Testcontainers
* JUnit
* Mockito
### 5.4 競合確認
以下の状態がないことを確認する。
* 同一ライブラリの複数バージョン
* Spring Boot管理バージョンの意図しない上書き
* `omitted for conflict`
* `FAILED`
* 解決不能な依存関係
* SNAPSHOT版の混入
* `NoSuchMethodError`につながる可能性のある不整合
Mavenの場合:
./mvnw dependency:analyze
Gradleの場合:
./gradlew dependencyInsight \
--dependency jackson-databind \
--configuration runtimeClasspath
必要に応じて対象ライブラリを変更して確認する。
### 記録事項
依存関係の変更を次の形式で記録する。
| ライブラリ | 変更前 | 変更後 | 影響箇所 | 確認方法 |
| --------------- | -------: | -------: | -------- | --------- |
| Jackson | 変更前バージョン | 変更後バージョン | JSON API | API回帰テスト |
| Hibernate ORM | 変更前バージョン | 変更後バージョン | DBアクセス | DB結合テスト |
| Spring Security | 変更前バージョン | 変更後バージョン | 認証・認可 | セキュリティテスト |
### 完了条件
* 3.5.6と3.5.16の依存関係差分が保存されている
* 主要ライブラリの変更内容が整理されている
* 未解決の依存関係競合がない
* 意図しないバージョン固定がない
---
## 6. コンパイルと単体テスト
### 6.1 クリーンビルド
Mavenの場合:
./mvnw clean compile
./mvnw test
一括実行する場合:
./mvnw clean verify
Gradleの場合:
./gradlew clean compileJava
./gradlew test
一括実行する場合:
./gradlew clean check
### 6.2 確認対象
* コンパイルエラー
* 非推奨APIの警告
* テスト失敗
* `NoSuchMethodError`
* `ClassNotFoundException`
* `BeanCreationException`
* Jacksonのシリアライズ差分
* Mockitoなどテストライブラリの挙動差
* 日付、enum、nullのテスト
* 例外メッセージに依存したテスト
### 6.3 テスト失敗時の対応
失敗原因を次のいずれかに分類する。
1. Spring Boot更新による挙動変更
2. 依存ライブラリ更新による挙動変更
3. テストコードが内部実装へ依存している
4. 変更前から存在していた不具合
5. 実行環境や外部サービスの問題
修正が必要な場合は、Spring Bootのバージョン変更とは別コミットにする。
例:
git add pom.xml
git commit -m "Upgrade Spring Boot to 3.5.16"
git add src
git commit -m "Adjust tests for Spring Boot 3.5.16"
### 完了条件
* コンパイルが成功する
* 単体テストがすべて成功する
* 未調査の警告や例外が残っていない
* 修正理由が記録されている
---
## 7. Spring Context起動テスト
### 7.1 基本テスト
以下のようなApplicationContext起動テストを実行する。
@SpringBootTest
class ApplicationContextTest {
@Test
void contextLoads() {
}
}
必要に応じて、テスト用Profileを指定する。
@SpringBootTest
@ActiveProfiles("test")
class TestProfileContextTest {
@Test
void contextLoads() {
}
}
### 7.2 実行
Mavenの場合:
./mvnw test \
-Dtest=ApplicationContextTest
Gradleの場合:
./gradlew test \
--tests "*ApplicationContextTest"
### 7.3 確認対象
* ApplicationContextが正常に生成される
* Bean生成に失敗しない
* 依存性注入が成功する
* Auto Configurationが正常に適用される
* `@ConfigurationProperties`のバインドに成功する
* DataSourceが正常に初期化される
* SecurityFilterChainが生成される
* Jackson関連Beanが生成される
* SchedulerやBatch関連Beanが生成される
* 循環参照が発生しない
* 起動時に外部サービスへ不要な接続を行わない
### 7.4 外部サービスの扱い
Contextテストで外部API、Kafka、RabbitMQ、SMTPなどへ接続しないよう、次のいずれかを使用する。
* テスト用Profile
* Testcontainers
* Mock Server
* WireMock
* テスト用Bean
* 外部接続を無効化するテスト設定
外部サービスのBeanをすべてモック化すると、実際のAuto Configuration問題を検出できなくなるため、必要最小限にする。
### 完了条件
* ApplicationContext起動テストが成功する
* Bean生成エラーがない
* Configuration Propertiesのバインドエラーがない
* 起動ログに未調査の重大な警告がない
---
## 8. 全Profileでの起動確認
## 8.1 対象Profileの洗い出し
以下から使用Profileを確認する。
* `application-*.properties`
* `application-*.yaml`
* デプロイスクリプト
* Dockerfile
* Docker Compose
* Kubernetes Manifest
* CI/CD定義
* 環境変数
* 運用手順書
例:
* `local`
* `test`
* `development`
* `staging`
* `production`
* `batch`
* `migration`
### 8.2 Profileごとの起動
JARを作成する。
Mavenの場合:
./mvnw clean package
Gradleの場合:
./gradlew clean bootJar
Profileを指定して起動する。
java -jar app.jar \
--spring.profiles.active=<profile>
環境変数を使用する場合:
SPRING_PROFILES_ACTIVE=<profile> \
java -jar app.jar
本番で外部設定ファイルを使用する場合は、同じ構成で確認する。
java -jar app.jar \
--spring.profiles.active=<profile> \
--spring.config.additional-location=file:./config/
### 8.3 Profileごとの確認項目
* 正しいProfileが有効になっている
* 起動が正常に完了する
* DB接続先が想定どおり
* 外部APIのURLが想定どおり
* Kafka、RabbitMQ、Redisなどの接続先が想定どおり
* SSL設定が想定どおり
* ログレベルが想定どおり
* Feature Flagが想定どおり
* `spring.config.import`の読み込み結果が想定どおり
* 外部設定がJAR内設定を正しく上書きする
* Actuator Healthが正常
* 不要なクラウド設定が有効化されていない
### 8.4 安全上の注意
本番Profileを確認する際は、実際の本番DBや外部サービスへ接続しない。
次のいずれかを使用する。
* 本番相当の検証用設定
* 接続先をテスト環境へ差し替えた外部設定
* Secretをダミー値へ置換
* 外部送信機能を無効化
* SchedulerやBatchの自動実行を無効化
### 8.5 記録表
| Profile | 起動結果 | DB接続 | 外部接続 | Health | 備考 |
| ------------ | ----- | ----- | ----- | ------- | -- |
| local | OK/NG | OK/NG | OK/NG | UP/DOWN | |
| test | OK/NG | OK/NG | OK/NG | UP/DOWN | |
| staging | OK/NG | OK/NG | OK/NG | UP/DOWN | |
| production相当 | OK/NG | OK/NG | OK/NG | UP/DOWN | |
### 完了条件
* 対象となるすべてのProfileで起動確認が完了している
* 設定値の読み込み結果が期待どおり
* 外部設定の上書き結果が期待どおり
* 未解決の起動エラーがない
---
## 9. ステージング環境へのデプロイ
### 9.1 デプロイ前確認
* ビルド成果物が3.5.16で作成されている
* GitコミットIDを記録している
* Docker Image Tagを記録している
* DB Migrationの有無を確認している
* ステージング用設定を確認している
* ロールバック対象の旧成果物を保持している
* 監視とログを確認できる状態にしている
### 9.2 デプロイ
通常のリリース手順に従い、ステージング環境へデプロイする。
デプロイ後、以下を確認する。
* Podまたはプロセスが正常起動する
* Restart Loopが発生していない
* Readiness Probeが成功する
* Liveness Probeが成功する
* `/actuator/health`が`UP`
* 起動ログに重大な例外がない
* DB Migrationが正常終了する
---
## 10. ステージング環境での回帰テスト
### 10.1 スモークテスト
最初に主要機能が利用可能であることを確認する。
* アプリケーション起動
* ログイン
* 主要画面表示
* 主要API
* DB参照
* DB更新
* Health Check
* 外部サービス接続
スモークテストが失敗した場合は、詳細な回帰テストへ進まず原因を調査する。
### 10.2 API回帰テスト
* GET、POST、PUT、PATCH、DELETE
* JSONリクエスト/レスポンス
* 日付・時刻
* enum
* null
* ページング
* ソート
* 入力エラー
* 業務エラー
* 例外レスポンス
* ファイルアップロード/ダウンロード
可能であれば、3.5.6環境と3.5.16環境のレスポンスを比較する。
JSON比較では、動的値を除外する。
例:
* ID
* タイムスタンプ
* トレースID
* ランダム値
* 表示順が保証されない項目
### 10.3 認証・認可テスト
* ログイン成功・失敗
* ログアウト
* JWT検証
* Token期限切れ
* 権限別アクセス
* 未認証アクセス
* 権限不足
* CORS
* CSRF
* Actuatorの公開範囲
### 10.4 DB回帰テスト
* 登録
* 検索
* 更新
* 削除
* Transaction Commit
* Transaction Rollback
* 複雑な検索条件
* ページング
* ソート
* 排他制御
* DB制約
* Flyway/Liquibase
### 10.5 外部連携テスト
利用しているものを対象とする。
* 外部REST API
* Kafka
* RabbitMQ
* Redis
* SMTP
* SFTP
* オブジェクトストレージ
* OAuth2/OIDC Provider
* 決済、通知などの外部サービス
確認内容:
* 正常接続
* 認証
* SSL/TLS
* タイムアウト
* Retry
* エラー時の処理
* 再接続
* メッセージ送受信
### 10.6 Batch・Scheduler
* Batchの正常終了
* Schedulerの起動
* 多重起動防止
* エラー時の再実行
* Transaction
* 実行履歴
* 外部送信の重複がない
### 10.7 Actuatorと監視
* Health
* Readiness
* Liveness
* Metrics
* Prometheus
* Info
* Log
* Alert
* DB Connection Pool
* HTTPエラー率
* レスポンスタイム
* JVM Memory
* GC
* Thread数
### 10.8 性能の簡易比較
主要APIについて、3.5.6と3.5.16を比較する。
* 平均レスポンスタイム
* p95
* p99
* Error Rate
* CPU
* Memory
* DB Connection Pool
* GC
* 外部API応答時間
明確な性能劣化がある場合は、本番リリース前に原因を確認する。
### 完了条件
* スモークテストが成功する
* 主要業務機能の回帰テストが成功する
* 認証・認可が正常
* DB処理が正常
* 外部連携が正常
* Actuatorと監視が正常
* 重大な性能劣化がない
* 未解決の重大障害がない
---
## 11. 不具合発生時の切り分け
不具合が発生した場合は、次の順番で確認する。
1. 3.5.6で同じ問題が発生するか
2. Spring Bootのバージョン変更以外の差分がないか
3. 依存関係ツリーに意図しない差分がないか
4. Profileと外部設定が正しいか
5. 環境変数、JVMオプション、起動引数が同じか
6. DBや外部サービスの状態に違いがないか
7. Spring Bootまたは依存ライブラリの変更によるものか
問題を再現する際は、ログ、リクエスト、レスポンス、設定値、スタックトレースを保存する。
---
## 12. ロールバック手順
ステージング環境で重大な問題が発生した場合は、次を実施する。
1. 3.5.16のデプロイを停止する
2. 3.5.6の旧成果物または旧Docker Imageへ戻す
3. 必要に応じて設定ファイルを旧版へ戻す
4. Health Checkを確認する
5. 主要機能のスモークテストを実行する
6. ロールバック結果を記録する
DB Migrationがある場合は、Migrationの後方互換性とロールバック可否を事前に確認する。
---
## 13. 成果物
作業完了時に、以下を残す。
* Spring Bootバージョン変更のGit差分
* 3.5.6の依存関係ツリー
* 3.5.16の依存関係ツリー
* 依存関係の比較結果
* コンパイル結果
* 単体テスト結果
* Spring Contextテスト結果
* Profile別起動確認結果
* ステージング回帰テスト結果
* 発生した不具合と対応内容
* 性能比較結果
* リリース可否判断
* ロールバック確認結果
---
## 14. 最終判定チェックリスト
### バージョン変更
* [ ] Spring Bootのみ3.5.16へ変更した
* [ ] 不要な依存ライブラリ変更がない
* [ ] 変更内容をGitで確認した
### 依存関係
* [ ] 3.5.6と3.5.16の依存関係を比較した
* [ ] 主要ライブラリの変更を確認した
* [ ] バージョン競合がない
* [ ] Spring Boot管理外の固定バージョンを確認した
### ビルド・テスト
* [ ] コンパイルが成功した
* [ ] 単体テストが成功した
* [ ] Spring Context起動テストが成功した
* [ ] 重大な起動時警告がない
### Profile
* [ ] すべての対象Profileで起動確認した
* [ ] 外部設定の上書きを確認した
* [ ] DBや外部サービスの接続先が正しい
* [ ] 本番Profileから本番環境へ誤接続していない
### ステージング
* [ ] ステージングへのデプロイが成功した
* [ ] スモークテストが成功した
* [ ] 主要機能の回帰テストが成功した
* [ ] 認証・認可が正常
* [ ] DB処理が正常
* [ ] 外部連携が正常
* [ ] Actuatorと監視が正常
* [ ] 重大な性能劣化がない
### リリース判定
* [ ] 未解決の重大障害がない
* [ ] 既知の問題と回避策を記録した
* [ ] ロールバック手順を確認した
* [ ] 本番リリース可能と判断した