29.1K Views
February 28, 23
スライド概要
Springがこれまでどのように進化してきたか、そして最新(2023年2月現在)の6.0ではどのような進化を遂げたかを解説しています。
合わせて、個人的にSpringのどのような部分を気に入っているか、どのような部分の改善を期待したいかを紹介しています。
Java、Spring、IntelliJ IDEA
Springの これまでとこれから (株)クレディセゾン/JJUG/JSUG 多田真敏 2023年2月28日 Oracle Java Developers Summit Online 2023 1
このセッションについて ▸ Springのこれまでの歴史や進化の過程、 および多田が個人的に思っている Springのメリット・デメリットを紹介します ▸ 対象者 ▸ Springを利用経験があり、 歴史や進化の過程に興味がある方 ▸ これからSpringの利用を検討している方 ▸ 前提知識 ▸ 何らかのフレームワークを使ったWeb開発の経験がある 2
このセッションで話さないこと ▸ 各技術の詳細な解説 ▸ あんまりコードは出てきません ▸ Springの歴史や、多田の個人的感想を 楽しんでいただければ幸いです ▸ Spring以外のフレームワークとの比較 ▸ 他のフレームワークに詳しくないので・・・😅 3
自己紹介 ▸ 多田真敏 (@suke_masa) ▸ 社内システムの内製化+AWS化 ▸ Spring歴約7年 ▸ 元・研修トレーナー ▸ JJUG & JSUGスタッフ ▸ Thymeleaf・Resilience4jの ドキュメント和訳 4
目次 ① Springとは何か ② Springのこれまで(1.x〜5.x) ③ Springのこれから(6.0) ④ Springのいいところ、改善を期待するところ ⑤ まとめ 5
目次 ① Springとは何か ② Springのこれまで(1.x〜5.x) ③ Springのこれから(6.0) ④ Springのいいところ、改善を期待するところ ⑤ まとめ 6
Springの誕生 ▸ 2002年、Rod Johnson氏が 「Expert One-on-One J2EE Design and Development」を出版 ▸ この本のサンプルプログラムが Spring Frameworkの前身 ▸ 重厚・複雑なJ2EE開発を軽量・簡単に ▸ 今はむしろSpringの方が重厚・複雑・・・😅 7
Springの歴史概要 20年以上の歴史! 2002 Expert One-to-One J2EE and Development が出版 2004 Spring Framework 1.0リリース 2006 Spring Framework 2.0リリース 2007 Spring Framework 2.5リリース 2009 Spring Framework 3.0リリース 2013 Spring Framework 4.0リリース(JDK 6ベース) 2017 Spring Framework 5.0リリース(JDK 8ベース) 2022 Spring Framework 6.0リリース(JDK 17ベース) 8
Spring Frameworkの主な構成要素 ① spring-context ▸ DI(依存性の注入) ② spring-aop ▸ AOP(割り込み処理) ③ spring-webmvc (Spring MVCとも呼ばれる) ▸ サーブレットベースの Webフレームワーク ⑤ spring-jdbc ▸ JDBCのラッパー(簡易ORマッパー) ⑥ spring-tx ▸ AOPによるトランザクション管理 ⑦ spring-test ▸ DIなどを利用できる テスティングフレームワーク拡張 ④ spring-web ux ▸ Nettyベースのノンブロッキング Webフレームワーク fl 9
Spring Framework以外にも色々 ① Spring Security ▸ 認証・認可の機能を提供 ② Spring Data ▸ データアクセスを抽象化 ▸ RDBでもNoSQLでも 同じようにアクセスできる ③ Spring Batch ▸ バッチ処理のための フレームワーク ④ Spring Boot ▸ Springの生産性を 更に高める(後述) ▸ ・・・他にもいろいろ エンタープライズ開発に必要なものが一通り揃っている! 10
Springの根幹: DIコンテナ ▸ DIコンテナ=インスタンスの入れ物 ※「インスタンス」とは、 もちろんJavaのインスタンスの ことです ▸ Bean=DIコンテナで管理されたインスタンス DIコンテナ Bean Bean Bean 必要に応じて 取り出して使う Bean Bean 11
DIコンテナは全Springプロダクトのベース ▸ 例:Spring MVCはDispatcherServlet内に コンテナを持っている DispatcherServlet DIコンテナ View Resolver Handler Mapping 必要に応じて 取り出して使う 12
この章のまとめ ▸ SpringはRod Johnson氏の書籍の サンプルプログラムが前身 ▸ 20年以上の歴史 ▸ さまざまなサブプロジェクトにより、 アプリケーション開発のほぼ全範囲がカバー ▸ 技術的な根幹はDIコンテナ 13
目次 ① Springとは何か ② Springのこれまで(1.x〜5.x) ③ Springのこれから(6.0) ④ Springのいいところ、改善を期待するところ ⑤ まとめ 14
Spring 1〜5までの進化 ▸ 開発容易性 ▸ テスト容易性 ▸ 運用容易性 の3つを継続的に向上させてきた 15
Spring Framework 1.x ▸ 2004年に1.0リリース ▸ Rod Johnson氏の書籍の サンプルプログラムが元 ▸ 1.xの時点で基本的な機能は揃っていた ▸ DI・AOP・DBアクセス・トランザクション ・MVC(の原形)・テストなど ▸ 設定は全てXMLで記述 16
Spring Framework 2.0.x/2.5.x ▸ 2006年に2.0リリース ▸ アノテーションでのトランザクション管理 ▸ Spring Securityの導入 ▸ 2007年に2.5リリース ▸ アノテーションによるBean定義 (コンポーネントスキャン) ▸ Spring Web MVCがアノテーションベースに ▸ 現在とほぼ同じ形 17
Spring Framework 3.x ▸ 2009年に3.0リリース ▸ Java Con g ▸ XMLと同じ設定をJavaで書ける ▸ 環境ごとの設定やBeanの切り替え ▸ Web MVC: REST対応 ▸ Web MVC: サーブレットコンテナ無しでのテスト fi 18
Spring Framework 4.x ▸ 2013年に4.0リリース ▸ JDK 8対応(6・7もサポート) ▸ WebSocket対応 ▸ その他、各機能で大量の改善 19
順調に発展してきたが、問題が・・・ ① サブプロジェクト+依存ライブラリが非常に多い ② 書くべき設定(Java Con g)が非常に多い 開発の第一歩を始めるのが非常に大変 fi 20
Spring Bootの誕生 ▸ 2014年にSpring Boot 1.0リリース ▸ Spring人気に🔥を付けた立役者 ▸ 現代のSpring開発では欠かせない ▸ 前述の問題を解決 ① 依存性が多い→ Starterライブラリ ② 設定が多い→ Auto Con gurationクラス fi 21
①starterライブラリ ▸ ライブラリをまとめたライブラリ ▸ バージョンの組み合わせもテストされている Web用のstarterライブラリを 追加しただけで、 これだけ多くのライブラリが 追加される! 22
②Auto Con gurationクラス ▸ 実装済みの Java Con gクラス を大量に提供 ▸ 設定を書く必要が ほぼ無くなる (ゼロではない) ▸ カスタマイズ可能 fi fi 23
Spring Bootのその他便利機能(詳細は後述) ▸ 実行可能JAR ▸ 組み込みサーバーや依存ライブラリを全て含む ▸ 単体で起動できる ▸ 設定の外部化 ▸ プロパティファイルの設定を環境ごとに切り替える ▸ 環境変数などで上書きできる ▸ Actuator ▸ 運用監視に必要な情報をWeb APIで提供 ▸ Kubernetes対応 ▸ ActuatorによるProbe機能、Secretマウント対応など ▸ ・・・他にもいろいろあります 24
世界的なマイクロサービス化の潮流 ▸ 2014年くらいから、世界的にマイクロサービスが 流行 ▸ マイクロサービスではモノリス以上に 考慮点が増える ▸ 通信相手がダウンしていたら? ▸ 絶え間なくスケールアウト/インする通信相手の IPアドレスをどうやって知る? ▸ 数多くのマイクロサービスをどうやって監視する? 25
Spring Cloudの誕生 ▸ マイクロサービスで必要なパターンを提供 ▸ Service Discovery ▸ Circuit Breaker ▸ Distributed Tracing ▸ ・・・など ▸ ただし、現代はインフラがその役割を担うことが多い ▸ 例: Kubernetes ▸ Spring Framework/Spring Bootに 取り込まれたものも(後述) 26
Spring Framework 5.x ▸ 2017年に5.0リリース ▸ JDK 8以上必須(9〜17もサポート) ▸ Spring WebFlux: リアクティブWebフレームワーク ▸ 低リソースでより多くのトラフィックを処理 ▸ Kotlinサポート ▸ JUnit 5対応 ▸ Spring Security: OAuth2/OIDC対応 27
この章のまとめ ▸ 開発容易性・テスト容易性・運用容易性が Spring 1.x〜4.xで順調に進化 ▸ 進化の過程で生じた問題をSpring Bootで解決 ▸ マイクロサービスアーキテクチャのために Spring Cloudが誕生 ▸ ただし現代では役割がインフラやSpring Bootに 取り込まれつつある ▸ Spring 5.xでさらなる進化 28
目次 ① Springとは何か ② Springのこれまで(1.x〜5.x) ③ Springのこれから(6.0) ④ Springのいいところ、改善を期待するところ ⑤ まとめ 29
2022年11月 ▸ Spring Framework 6.0 + Spring Boot 3.0リリース🎉 ▸ 運用容易性の向上がテーマ 30
目玉アップデート ① オブザーバビリティの進化 ② ネイティブ化対応 ③ JDK 17 + Jakarta EE 9ベース(今回は解説しません) ▸ javax.* ➡ jakarta.* 31
①オブザーバビリティの進化 ▸ オブザーバビリティ(可観測性)の3本柱 ん?この時間にCPU使用率が上がってるぞ? ① メトリクス📈 ▸ ある瞬間のCPU使用率、メモリ使用量、JVMスレッド数など ② トレーシング↩ この時のリクエスト、どの処理が重いのかな? ▸ ある1つのリクエスト・レスポンス内での、各処理の時間の記録 ③ ログ📝 この重い処理で何が起こっていたのかな? ▸ いつ・どんな処理が行われたかの時系列記録 32
①オブザーバビリティの進化 Spring Cloud無しで トレーシングが可能に! Spring Boot 2.x以前 Spring Boot 3.0 Spring Boot Actuator + Micrometer Spring Boot Actuator + Micrometer トレーシング Spring Cloud Sleuth Spring Boot Actuator + Micrometer ログ Spring Boot Starter Logging Spring Boot Starter Logging メトリクス 33
①オブザーバビリティの進化 ▸ Spring FrameworkがMicrometerに対応 ▸ 以前はSpring Bootで対応 ▸ 詳細は、VMware槙さんによる Prometheus + Grafanaの デモ動画をご覧ください 34
②ネイティブ化対応 ▸ クラウドにおけるSpringの問題点 ① 起動が遅い ▸ JVMの起動、Beanインスタンスの一斉生成、 組み込みサーバーの起動・・・などが要因 ▸ 負荷増大時に瞬時にスケールできない、 FaaSでコストがかさむ等のデメリット ② メモリ消費量が多い ▸ JVM言語共通の課題 ▸ インスタンスコストがかさむデメリット 35
②ネイティブ化対応 ▸ GraalVMのネイティブイメージで 高速起動+省メモリ😍 ▸ しかしSpringは ① リフレクションを多用 ② 実行時にバイトコード操作を多用 ▸ そのままではネイティブイメージが動かない😭 36
②ネイティブ化対応 ▸ ビルド時に以下を生成して問題解決!😆 ① リフレクションを使わないJavaソースコード ② GraalVM向けのJSONヒントファイル ▸ 詳細はVMware槙さんのデモ動画で 37
②ネイティブ化対応 ▸ 簡易実験の結果比較 ※今回の環境 MacBook Pro (M1 Pro・メモリ32GB) Spring Boot 3.0.2による Hello WorldレベルのWebアプリ ▸ 環境によって結果は異なるので注意 起動時間 メモリ 通常のJAR 0.932秒 142.3MB ネイティブ イメージ 0.049秒 28.5MB 約19分の1 約5分の1 38
②ネイティブ化対応 ▸ しかし、ネイティブコンパイルは遅い😅 ▸ 今回の環境で約1分 39
この章のまとめ ▸ Spring 6のテーマは運用容易性の向上 ▸ オブザーバビリティの進化 ▸ Spring Cloud無しでトレーシング可能 ▸ Spring Framework本体でMicrometer対応 ▸ ネイティブ化対応 ▸ 高速起動+省メモリでスケーラビリティ向上 ▸ しかしコンパイルは時間がかかる 40
目次 ① Springとは何か ② Springのこれまで(1.x〜5.x) ③ Springのこれから(6.0) ④ Springのいいところ、改善を期待するところ ⑤ まとめ 41
Springのいいところ😍 ▸ 開発容易性・テスト容易性・運用容易性が すべて高い! ▸ (他のフレームワークと比較したものではなく、 あくまで多田の主観です) ▸ Spring Bootにより更に高まっている 42
開発容易性が高い! ▸ 基本的な機能は全て揃っている ▸ DI・AOP・DBアクセス・トランザクション ・セキュリティ・テスト・メッセージング・バッチ ・・・他にもいろいろ ▸ 細かい機能も非常に充実 ▸ 型変換・キャッシュ・リトライ・・・他にもいろいろ ▸ 総じて、わざわざ作らなくても 既に存在するものが多い 43
テスト容易性が高い! 個人的なお気に入りポイント ▸ テスト毎に設定やBeanを容易に切り替え ▸ DBアクセスのテスト時に簡単にデータを初期化 ▸ サーブレットコンテナの起動無しで MVCのコントローラーや認証認可のテスト ▸ Web APIのE2Eテストも簡単 44
運用容易性が高い! ▸ 環境ごとに設定やBeanを容易に切り替え ▸ プロパティファイルの設定を環境変数で上書き ▸ Spring Boot Actuatorで メトリクスなどをWeb APIで取得 ▸ Spring Boot 3でトレーシングが Spring Cloud無しで可能 45
・・・とは言え、 ▸ 改善してほしい部分もいくつかあります😅 46
学習コストが高い! ▸ 多機能ゆえに、覚えることも多い ▸ Spring WebFluxでは リアクティブプログラミングも必要 ▸ Virtual Threadsで今後どうなるか? ▸ 日本語書籍が少ない ▸ Spring 5以降に対応したものが少ない ▸ 書籍出版の噂を聞いているのでお楽しみに 47
暗黙知が多い! ▸ 多機能ゆえにドキュメントで網羅されていない ▸ Javadocやソースコードを読み込む必要あり ▸ 多田が尊敬する先輩エンジニアの皆さんでも ご存知のない事柄は色々あった ▸ もちろん多田が知らないことも多いはず ▸ JSUGなどのコミュニティを活用してほしいです 48
[Boot・Security] 非互換性が多い! ▸ 半年に1回マイナーバージョンアップ ▸ 既存機能の非推奨化・削除のペースが早い ▸ 例) Spring SecurityのmvcMatchers()が 5.8で非推奨化→6.0で削除 (ただし、5.8と6.0は同時リリース) ▸ Spring Boot starterライブラリが依存する サードパーティライブラリの非互換性 ▸ 自動テストの整備は必須 49
起動が遅い! ▸ 原因 ▸ 起動時のBeanインスタンス一斉生成 ▸ 組み込みサーバーの起動 ▸ 柔軟にスケールする際、起動の遅さは壁 ▸ GraalVMによるネイティブ化で解決可能 ▸ しかしコンパイル時間が長い・・・ 50
必要なリソースが多い! ▸ SpringというよりはJava共通の課題 ▸ ネイティブ化やVirtual Threadsに期待したい 51
この章のまとめ ▸ 良い点 ▸ 開発容易性・テスト容易性・運用容易性が高い ▸ 改善を期待する点 ▸ 学習コストが高い、暗黙知が多い、 Spring Boot・Spring Securityは非互換性が多い、 起動が遅い、必要なリソースが多い ▸ ネイティブ化やVirtual Threadsで一部解決可能? 52
目次 ① Springとは何か ② Springのこれまで(1.x〜5.x) ③ Springのこれから(6.0) ④ Springのいいところ、改善を期待するところ ⑤ まとめ 53
このセッションのまとめ ▸ SpringはRod Johnson氏の書籍のサンプルプログラムとして 誕生。20年以上の歴史。 ▸ Spring 1〜5 ▸ 開発容易性・テスト容易性・運用容易性が進化し続けた ▸ Spring 6 ▸ ネイティブイメージ化+オブザーバビリティが進化 → 運用容易性(スケーラビリティ含む)が更に高まった ▸ 開発容易性・テスト容易性・運用容易性が高いのがおすすめポイント ▸ 学習コストの高さ・暗黙知の多さ・非互換性の多さ ・起動の遅さ・必要なリソースの多さが改善ポイント 54
参考文献 ▸ Wikipedia ▸ Spring徹底入門(翔泳社) ▸ Spring Framework Reference ▸ Spring Boot Reference 55
ご清聴ありがとうございました! 56