Spring
2021.09.21
Spring Framework 入門! 特徴やbootとの違い、ダウンロードからインストールまでをわかりやすく解説
2023.11.15


Spring Frameworkとは?

そもそもフレームワークとは?

フレームワーク(framework)とは概念的な単語で、「枠組み」、「骨組み」、「構造」といった意味があります。アプリケーション開発におけるフレームワークとは、システム開発に必要な土台となる機能を提供するもの(ライブラリやプログラム)です。フレームワークを利用することで、共通的な機能を1から開発する(車輪の再発明)必要がなくなり、開発期間を大幅に短縮できます。Spring Frameworkには、ログイン認証などセキュリティに関する機能も提供されているため、独自でセキュリティ対策をする必要もなく、一定のセキュリティレベルを担保できます。
フレームワークのルールを守って開発をすることで担当者ごとのばらつきを減らし、コードの書き方を統一しやすくなります。また経験の浅いエンジニアでもフレームワークの規約やルールに沿って開発を進めることで、一定の品質を担保することが可能です。
JavaのフレームワークではSpring Frameworkの他にPlay framework(https://www.playframework.com/)が有名で、こちらはScalaでも動作させることが可能です。また最近は脆弱性の問題で下火になりましたが、Struts/Struts2(https://struts.apache.org/)は非常に有名で、以前のJavaのWebアプリケーション開発では非常によく使われていました。

Spring Frameworkとは

Spring FrameworkはJavaのアプリケーションフレームワークです。初期のJ2EE仕様(EJB2)の複雑さへの対応として2003年に登場し、2004年にバージョン1.0がリリースされました。特にWebアプリケーションの開発に必要となる様々な機能を提供しており、近年のJavaのWebアプリケーション開発におけるデファクト・スタンダードとなっています。様々なサブプロジェクトが存在し、アプリケーションにおける豊富な機能を提供しています。またJava以外にもJVM言語である、GroovyやKotlinもサポートしています。

Spring Frameworkの歴史

バージョン リリース年 主なリリースなど
1.0 2004
2.02006Spring Security、Spring Web Flow
2.52007Spring MVC、Spring Integration、Spring Batch、アノテーションベースDI
3.02009Javaコンフィグ、JPA2.0、Bean Validation
4.02013WebSocket、Webメッセージングのサポート、Java SE8、JavaEE7対応
5.02017WebFlux(リアクティブWeb)、Kotlinサポート

Spring Bootとの違い

Spring Frameworkは様々なプロダクトや機能が提供されている反面、設定が複雑であり、環境構築に手間と時間がかかります。そこで2014年に登場したのがSpring Bootです。
Spring BootはWebアプリケーションの構築に必要な設定が予め定義されており、必要最低限の設定を行うだけで、アプリケーションを構築できます。またアプリケーションの内部に、組み込みのアプリケーション・サーバー(Tomcat)を内包しているため、アプリケーション・サーバーの構築も不要です。
Spring Bootは内部的にSpring Frameworkの様々なプロダクトを使用しているため、Spring Bootを使うのであれば、必然的にSpring Frameworkを扱う知識や経験が必要になります。

Spring Tool Suite (STS)とは?

Spring Tool Suite (STS)とはSpring Frameworkを使ったアプリケーション開発を行うためのIDE(統合開発環境)で、無償で提供されています(https://spring.io/tools)。Eclipseをベースに開発されているため、Eclipseを使った経験がある方は違和感なく利用できるでしょう。またEclipseのプラグインやVisual Studio Code用のプラグインも提供されています。
GitやMavenを扱うためのプラグインや、アプリケーションを実行するためのアプリケーション・サーバー環境も準備されているため、開発を行うための環境を短時間で準備できます。
デフォルトでは英語表示になりますが、Eclipse用の日本語化プラグインをインストールすることで日本語表示も可能です。

Spring Frameworkの特徴


Spring Frameworkには様々なプロダクトが存在しますが、一番の特徴として上げられるのは、DI(Dependency Injection)とAOP(Aspect Oriented Programming)ではないでしょうか。

DI (Dependency Injection)

DIとはDependency Injectionの略称であり、日本語では「依存性の注入」と呼ばれますが、何のことかわかりづらいですよね。
Spring FrameworkにおけるDIの「依存性」とはクラスインスタンスの事を指します。
あるクラスが別のクラスを利用する場合に、クラス内でインスタンス生成を行うのではなく、Spring FrameworkのDI機能を使いインスタンスを設定(注入)します。DIを利用することで個々のクラス同士が疎結合な状態となり、変更に強くなり、クラスの保守性、再利用性の向上が可能です。また、単体テストが容易になり品質の向上にも繋がります。
Spring FrameworkのDIは注入される「依存性」(クラスインスタンス)の生存期間(ライフサイクル)を管理することができ、アプリケーション内でたった1つだけ存在し、他の全てのプログラムから参照する(singleton)や呼び出される度にインスタンスを生成する(prototype)、セッション単位でインスタンスを生成する(session)、HTTPのリクエストの単位でインスタンスを生成する(request)などを使用できます。ライフサイクル管理をうまく使うことにより、アプリケーション内でのオブジェクトの共有を容易に設定できます。
リリース当時はXMLファイルで設定を行っていましたが、バージョンアップにより、アノテーションによる設定(2.5から)、Javaコンフィグクラスでの設定(3.0)などより簡単に設定を行えるようになっています。

AOP (Aspect Oriented Programming)

AOPとはアスペクト指向プログラミング(Aspect Oriented Programming)の略称で、複数のクラスで点在する横断的な関心事(共通処理など)を扱うプラグラミング手法です。AOPを利用することで元のクラスに変更を加えることなく、共通処理を入れ込む事ができるようになります。また、同じ処理を個々のクラスに記述する必要がなくなるため、プログラムの保守性も向上します。用途としては、ロギング、キャッシュ処理、例外ハンドリングなど多岐にわたりますが、どの処理が実行されるかの見通しが良くないため、業務ロジックの共通化の用途では使用すべきではありません。また、Spring Framework自身もトランザクション処理や認証処理など、様々な機能でAOPの機能を使用しています。
こちらもDIと同様にバージョンを重ねるにつれ、簡単に設定を行えるようになっています。

様々なプロジェクト

Spring Frameworkにはさまざまなプロジェクトが存在しています。

Spring MVCWebアプリケーションの開発に必要な機能を持ったフレームワークです。その名の通りMVC(Model-View-Controller)パターンを採用しています。
入力データの検証(Bean Validator)や型変換、View機能との連携(JSP、Thymeleafなど)などの機能を提供しています。またWebAPIベースの機能もSpring MVCによって提供されています。
Spring WebFluxSpring Framework5から追加された機能で、リアクティブプログラミングをサポートするためのフレームワークです。最大の特徴はノンブロッキング処理を行えることで、スレッドを節約することができ、マイクロサービスアーキテクチャーでのシステム間通信などに向いています。
コーディングスタイルが従来までの記述方法と大きく異なるため、Spring MVCをそのまま置き換えて使用するのは難しいでしょう。
Spring Securityログイン機能に代表されるような認証・認可の機能を提供するフレームワークです。以前は「Acegi Security System for Spring」という名称で開発されていましたが、後に正式なSpringのプロジェクトに昇格しました。様々な認証方式に対応し、OAuth認証機能やActiveDirectoryとの連携機能、独自データベースでの認証などの機能が提供されています。また、CSRF対策機能などの脆弱性対策も行われています。高機能な反面、設定が非常に複雑になっており、学習コストは非常に高いです。
Spring DataSpring Dataはデータベース(RDS)やNoSQLなどのデータストア(永続先)を扱う機能を持ったフレームワークです。扱う製品ごとにサブプロジェクト化されており、様々なプロジェクトが存在します。
・Spring Data JPA: JPAを扱うためのライブラリ
・Spring Data JDBC: シンプルなJDBCアクセス機能を持ったライブラリ(MyBatisとの連携機能も提供しています)
・Spring Data Redis: NoSQLであるRedisを扱うためのライブラリ
・Spring Data REST: Spring Dataで扱うデータをRESTのリソースとしてアクセスできるようにするためのライブラリ
Spring Batchバッチアプリケーションの開発に必要な機能を持ったフレームワークです。様々な入力・出力ソースに対応し、状態の管理やリトライ処理の実装、分散処理機能など非常に強力な機能を保持しています。またJavaバッチ仕様であるjBatchもサポートしています。
Spring SessionWebアプリケーションで使用するセッションを扱うための機能を提供するフレームワークです。通常アプリケーション・サーバー側で管理されるセッションをSpring Sessionで管理できるようになります。複数台のサーバーを使用してクラスタリングを行う際にアプリケーション・サーバーに依存することなく環境を構築できます。



Spring Frameworkを使うメリット

提供されている機能・モジュールが豊富

Spring Frameworkでは様々な機能が提供されているため、必要なときに対象となる機能・モジュールを追加するだけで短時間で利用できるようになります。

変更が容易

DIの機能を用いて開発をすることによりクラス、コンポーネント間の依存度が低くなり(疎結合となり)、変更に対して強いシステムを開発できます。また、AOPの機能を使用することで、共通的な処理を冗長的に記述するのではなく、一元管理することができ、保守性も高まります。後から共通処理を追加する場合でも個々のプログラムを修正する必要はなく、AOPの設定を追加するだけで実現可能です。

テストがスムーズに行える

Spring Frameworkでは単体テスト、結合テストなど様々なテスト用のライブラリを提供しています。JUnitとの統合、JPAやMyBatisといったORM(DB関連のライブラリ)向けのテストライブラリの提供など、さまざまな環境でのテストが可能です。
またDIの機能を使うことにより、ソースコードを変更することなく、テスト用の実行環境を構築することが可能です。

Spring Frameworkをダウンロードし、インストールするまで


Spring Frameworkを利用するにはMavenやGradleといったビルドツールを使うのがおすすめです。ビルドツールを使わず公式サイト(https://repo.spring.io/release/org/springframework/spring/)からjarファイルをダウンロードしてプロジェクトに組み込むこともできますが、依存するライブラリの追加などを自分で解決する必要があり、あまりおすすめできません。
また、Spring Bootが提供するspring initializrというツールを使用すれば、必要な機能を選択するだけで、MavenやGradleの設定ファイルも含んだアプリケーションの雛形を作成してくれます。STSやEclipseなどのIDE(統合開発環境)からも利用できるため、非常に簡単です。まずはSpring Frameworkを触ってみたいという方はSpring Bootの使用をおすすめします。

Spring Frameworkのサポート期限


Spring Frameworkにはバージョンごとにサポート期限があります。古いバージョンを使用している場合は注意しましょう。

バージョンサポート終了日
Spring Framework 4.32020年12月31日
Spring Framework 5.02020年12月31日
Spring Framework 5.12020年12月31日
Spring Framework 5.22021年12月31日
Spring Framework 5.3未定



Spring Framework利用する際に必要なスキル


Javaの基本的な知識があれば、Spring Frameworkを使うことはできますが、やはりSpring Framework自体を学習しないとアプリケーションの開発は難しいでしょう。とはいえSpring Frameworkは膨大な数のプロダクトが存在するため習得には時間がかかります。まずはSpring Bootから学習を進め、アプリケーション開発に必要なものから順に修得する方法をおすすめします。
Spring Frameworkに限ったことではありませんが、セッションやCookie、HTTPステータスといったHTTPに関する知識があればWebアプリケーションの開発に役に立ちます。また、Web APIを使用するケースでは、Restful APIについての知識があればスムーズに開発が進められるでしょう。

この記事をシェア