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. Spring Boot 2 から 3 へ
    バージョンアップしてみた
    2023/06/04 JJUG CCC 2023 Spring

    View Slide

  2. ⾃⼰紹介
    猪熊 朔也 ( いのくま さくや )
    - 株式会社 Red Frasco
    - インフラエンジニア
    - Twitter(@sinocloudon)
    u経歴
    ⾦融系SIer -> リクルート -> ⾦融系スタートアップ -> Red Frasco
    uその他コメント
    - ⾹川県出⾝
    - うどんが好きです
    - うどん脳 をプロフィールアイコンにすることが多いです
    - ラーメン⼆郎も好きです
    2

    View Slide

  3. 3
    はじめに

    View Slide

  4. ⽬次
    バージョンアップ対象について
    バージョンアップで実施したこと
    発⽣した課題とその対処
    まとめ

    View Slide

  5. 5
    バージョンアップ対象について

    View Slide

  6. 不動産会社向けの業務⽀援システムにおける事例です
    6
    不動産会社
    担当者
    ⼊⼒ 変換 連携
    業務⽀援
    システム
    他システム
    物件データ
    画像データ
    ⼿⼊⼒
    連携先システム
    ⾃動連携 システムA
    システムB
    システムC
    システムD
    ⾃動連携
    ⾃動連携
    ⾃動連携
    ⾃動連携

    View Slide

  7. システム構成
    • Web アプリとバッチが存在します
    • Web アプリ︓Spring Boot
    • バッチ︓Spring Boot, Spring Batch
    7
    Aurora
    ALB EC2
    Amazon
    EventBridge
    AWS Step Functions workflow
    AWS Batch AWS Batch AWS Batch

    View Slide

  8. Webアプリ構成
    8
    Spring
    Security
    Controller Service
    Spring
    Session
    DAO
    (MyBatis)
    Thymeleaf
    Spring
    Security
    Rest
    Controller
    SPA
    (Vue.js)
    DB
    外部
    システム
    MPA

    View Slide

  9. バッチ構成
    9
    Step
    (Tasklet)
    Service
    DAO
    (MyBatis) DB
    外部
    システム
    Batch
    Application
    Batch Configuration
    Job

    View Slide

  10. バージョン情報
    対象 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

    View Slide

  11. 11
    バージョンアップで実施したこと

    View Slide

  12. なぜバージョンアップするのか︖
    • 5年ぶりのメジャーバージョンアップ
    • バージョンアップがどれくらい⼤変なのか把握しておきたかった
    • そもそもサポート期間が最⻑2年しかない
    • こまめなバージョンアップを前提とした運⽤を整備する必要性
    • 追従しないことによるデメリット
    • バグ修正、脆弱性対応が実施されないリスク
    12

    View Slide

  13. 13
    https://spring.pleiades.io/projects/spring-boot#support

    View Slide

  14. バージョンアップの流れ
    • Migration Guide に⽬を通す
    • https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-
    Migration-Guide
    • 実際にバージョンアップしてエラーを1つずつ解消
    • なお、Java ⾃体のバージョンアップはしていません
    • すでに Java 17(Amazon Corretto) を使⽤していたため
    14
    発⽣した課題とその対処について共有します

    View Slide

  15. 15
    発⽣した課題とその対処

    View Slide

  16. 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
    仕様変更のポイント
    課題と対処

    View Slide

  17. 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
    仕様変更のポイント
    課題と対処

    View Slide

  18. 明⽰的なアクセス許可 (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
    仕様変更のポイント
    課題・対処

    View Slide

  19. 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
    仕様変更のポイント
    課題・対処

    View Slide

  20. SecurityContextRepository のデフォルト実装変更 (Spring Security)
    • SecurityContextRepository のデフォルト実装が
    DelegatingSecurityContextRepository に変更
    • 認証に成功しても未認証扱いのままになった
    • 仕様変更の影響でセッションが永続化できていなかった
    • DelegatingSecurityContextRepository を使⽤するようコードを変更
    20
    https://docs.spring.io/spring-
    security/reference/servlet/authentication/persistence.html#securitycontextrepository
    仕様変更のポイント
    課題・対処

    View Slide

  21. @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

    View Slide

  22. 22
    https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Migration-Guide#enablebatchprocessing-is-now-discouraged

    View Slide

  23. 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
    仕様変更のポイント
    課題・対処

    View Slide

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

    View Slide

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

    View Slide

  26. 26
    番外編

    View Slide

  27. Gradle の Version catalog 化
    • Version catalog 対応を実施
    • プロジェクトごとにバージョン定義・管理し続けるのが⾯倒だった
    • Version catalog で⼀元管理できるように変更
    • Renovate も導⼊し、今後のバージョンアップ運⽤を効率化
    27

    View Slide

  28. Spring Boot Migrator (SBM)
    • Spring Boot のアップデートツールがあるらしい…
    • ただし、以下の条件を満たす必要あり
    • Spring Boot 2.7 -> 3.0 の移⾏パスのみ
    • Java 17, Maven のみ(Gradle はサポートされていない)
    28
    Gradle がサポートされたら試してみます

    View Slide

  29. 29
    まとめ

    View Slide

  30. Spring Boot バージョンアップのまとめ
    • 普通にアプリが動かなくなったのでちょっと焦った
    • バージョンアップ作業にかかった時間は3⽇程度
    • アップデートのPRを出してマージするまで
    • 本番稼働している場合は、テスト・リリース⼯数がプラス
    • Migration Guide を⼀通り読んでから作業する
    • 外部ライブラリの確認も忘れずに
    • ⾃動テスト(ユニットテスト、E2Eテスト)を前提にすることで
    バージョンアップ運⽤に備える
    30

    View Slide

  31. Special Thanks!!
    31
    @shinops
    より詳細な情報は
    記事にまとめてみたよ

    View Slide

  32. 32
    後⽇公開します

    View Slide

  33. END OF
    PRESENTATION
    ご清聴ありがとうございました

    View Slide