Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Spring Boot 2 から 3 へバージョンアップしてみた

Spring Boot 2 から 3 へバージョンアップしてみた

JJUG CCC 2023 Spring の登壇資料です

より詳細な内容は Zenn をご覧ください
https://zenn.dev/red_frasco/articles/637280c126d959

Red Frasco

June 04, 2023
Tweet

More Decks by Red Frasco

Other Decks in Technology

Transcript

  1. ⾃⼰紹介 猪熊 朔也 ( いのくま さくや ) - 株式会社 Red

    Frasco - インフラエンジニア - Twitter(@sinocloudon) u経歴 ⾦融系SIer -> リクルート -> ⾦融系スタートアップ -> Red Frasco uその他コメント - ⾹川県出⾝ - うどんが好きです - うどん脳 をプロフィールアイコンにすることが多いです - ラーメン⼆郎も好きです 2
  2. 不動産会社向けの業務⽀援システムにおける事例です 6 不動産会社 担当者 ⼊⼒ 変換 連携 業務⽀援 システム 他システム

    物件データ 画像データ ⼿⼊⼒ 連携先システム ⾃動連携 システムA システムB システムC システムD ⾃動連携 ⾃動連携 ⾃動連携 ⾃動連携
  3. システム構成 • Web アプリとバッチが存在します • Web アプリ︓Spring Boot • バッチ︓Spring

    Boot, Spring Batch 7 Aurora ALB EC2 Amazon EventBridge AWS Step Functions workflow AWS Batch AWS Batch AWS Batch
  4. Webアプリ構成 8 Spring Security Controller Service Spring Session DAO (MyBatis)

    Thymeleaf Spring Security Rest Controller SPA (Vue.js) DB 外部 システム MPA
  5. バージョン情報 対象 From To Spring Boot 2.7.1 3.0.1 Spring Framework

    5.3.23 6.0.3 Spring Security 5.7.2 6.0.1 Spring Batch 4.3.6 5.0.0 10
  6. バージョンアップの流れ • Migration Guide に⽬を通す • https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0- Migration-Guide • 実際にバージョンアップしてエラーを1つずつ解消

    • なお、Java ⾃体のバージョンアップはしていません • すでに Java 17(Amazon Corretto) を使⽤していたため 14 発⽣した課題とその対処について共有します
  7. Java EE → Jakarta EE 対応 (Spring Framework) • javax

    -> jakarta • パッケージ名が変わったので、ひたすら置換 16 https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Migration-Guide#jakarta-ee 仕様変更のポイント 課題と対処
  8. Trailing Slash 対応 (Spring Framework) • Trailing Slash のオプションが⾮推奨 •

    deprecated かつ デフォルト false • 末尾スラッシュのありなしが区別されることによる不具合が発 ⽣したので、アプリケーションを修正 • Trailing Slash がオプションによって付与されることを前提としていた • 明⽰的にTrailing Slash ありに統⼀することで解消 17 https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Migration-Guide#spring-mvc- and-webflux-url-matching-changes 仕様変更のポイント 課題と対処
  9. 明⽰的なアクセス許可 (Spring Security) • Authorization ルールに合致しないリクエストはデフォルト拒否 • ALB からのヘルスチェックが失敗するようになった •

    Spring Boot Actuator を使ってヘルスチェックをしていたが、明⽰的な ルールが存在しなかったため、ALB のヘルスチェックが失敗 • actuator 配下のURL に対して明⽰的な許可を追加した 18 https://docs.spring.io/spring- security/reference/5.8/migration/servlet/authorization.html#_ensure_that_all_requests_have_defined_au thorization_rules 仕様変更のポイント 課題・対処
  10. Dispatch Type の指定 (Spring Security) • すべての dispatch type (request,

    async, error, forward, include) が Filter の適⽤対象になる • 無限ループが発⽣ • AuthenticationFailureHandler の実装で forward を利⽤ • 認証失敗時、forward 先でも Filter が適⽤されてしまう • spring.security.filter.dispatcher-types プロパティを追加し、Filter の 適⽤対象を限定 19 https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Migration-Guide#dispatch-types 仕様変更のポイント 課題・対処
  11. SecurityContextRepository のデフォルト実装変更 (Spring Security) • SecurityContextRepository のデフォルト実装が DelegatingSecurityContextRepository に変更 •

    認証に成功しても未認証扱いのままになった • 仕様変更の影響でセッションが永続化できていなかった • DelegatingSecurityContextRepository を使⽤するようコードを変更 20 https://docs.spring.io/spring- security/reference/servlet/authentication/persistence.html#securitycontextrepository 仕様変更のポイント 課題・対処
  12. @EnableBatchProcessing が⾮推奨 (Spring Batch) • @EnableBatchProcessing のアノテーションを削除しないと、 Spring Boot の

    AutoConfiguration が有効にならない。 • バッチジョブが動かなくなった • バッチジョブ定義を AutoConfiguration で設定していたため • @EnableBatchProcessing のアノテーションを削除 • ⾒出し “@EnableBatchProcessing is now discouraged” しか読んでなかった らハマった(⾮推奨なだけじゃないの︖なんで動かないの︖) 21 仕様変更のポイント 課題・対処 https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Migration- Guide#enablebatchprocessing-is-now-discouraged
  13. JobBuilderFactory, StepBuilderFactory が⾮推奨 (Spring Batch) • JobBuilderFactory -> JobBuilder •

    StepBuilderFactory -> StepBuilder • JobBuilder, StepBuilder を利⽤するように修正 23 https://github.com/spring-projects/spring-batch/wiki/Spring-Batch-5.0-Migration- Guide#jobbuilderfactory-and-stepbuilderfactory-bean-exposureconfiguration 仕様変更のポイント 課題・対処
  14. その他依存ライブラリへの影響 • Datadog APM ⽤の Agent が当初 Spring Boot 3

    未サポートだった • アプリケーションが全く動かなくなる • 切り分けた結果、Datadog APM の Agent が悪さをしていた • サポートされるまで Datadog APM の利⽤を停⽌ • 現在はサポートされています • https://github.com/DataDog/dd-trace-java/pull/4605 24 仕様変更のポイント 課題・対処
  15. その他依存ライブラリへの影響 • Datadog APM ⽤の Agent が当初 Spring Boot 3

    未サポートだった • アプリケーションが全く動かなくなる • 切り分けた結果、Datadog APM の Agent が悪さをしていた • サポートされるまで Datadog APM の利⽤を停⽌ • 現在はサポートされています • https://github.com/DataDog/dd-trace-java/pull/4605 25 仕様変更のポイント 課題・対処 外部ライブラリの サポート状況確認も忘れずに︕
  16. Gradle の Version catalog 化 • Version catalog 対応を実施 •

    プロジェクトごとにバージョン定義・管理し続けるのが⾯倒だった • Version catalog で⼀元管理できるように変更 • Renovate も導⼊し、今後のバージョンアップ運⽤を効率化 27
  17. Spring Boot Migrator (SBM) • Spring Boot のアップデートツールがあるらしい… • ただし、以下の条件を満たす必要あり

    • Spring Boot 2.7 -> 3.0 の移⾏パスのみ • Java 17, Maven のみ(Gradle はサポートされていない) 28 Gradle がサポートされたら試してみます
  18. Spring Boot バージョンアップのまとめ • 普通にアプリが動かなくなったのでちょっと焦った • バージョンアップ作業にかかった時間は3⽇程度 • アップデートのPRを出してマージするまで •

    本番稼働している場合は、テスト・リリース⼯数がプラス • Migration Guide を⼀通り読んでから作業する • 外部ライブラリの確認も忘れずに • ⾃動テスト(ユニットテスト、E2Eテスト)を前提にすることで バージョンアップ運⽤に備える 30