1. 概要

この記事では、最も人気のあるJavaフレームワークの1つとして、Springの主な価値提案について説明します。

さらに重要なのは、Springが私たちの選択のフレームワークである理由を理解しようとすることです。 Springとその構成部品の詳細は、以前のチュートリアル広くカバーされています。 したがって、導入の「方法」の部分をスキップし、主に「理由」に焦点を当てます。

2. なぜフレームワークを使用するのですか?

特にSpringについて説明する前に、そもそもなぜフレームワークを使用する必要があるのかを理解しましょう。

Javaのような汎用プログラミング言語は、さまざまなアプリケーションをサポートできます。 言うまでもなく、Javaは日々積極的に取り組んでおり、改善されています。

さらに、この点でJavaをサポートするための無数のオープンソースおよびプロプライエタリライブラリがあります。

では、なぜフレームワークが必要なのですか? 正直なところ、タスクを実行するためにフレームワークを使用する必要は絶対にありません。 ただし、いくつかの理由から、1つを使用することをお勧めします。

  • 関連する定型文ではなく、コアタスクに集中するのに役立ちます
  • 長年の知恵をデザインパターンの形でまとめます
  • 業界および規制基準を順守するのに役立ちます
  • アプリケーションの総所有コストを削減します

ここで表面をかじったところですが、そのメリットを無視するのは難しいと言わざるを得ません。 しかし、それがすべてポジティブになるわけではないので、キャッチは何ですか?

  • 特定の方法でアプリケーションを作成するように強制します
  • 言語とライブラリの特定のバージョンにバインドします
  • アプリケーションのリソースフットプリントに追加します

率直に言って、ソフトウェア開発には特効薬はなく、フレームワークも例外ではありません。 したがって、どのフレームワークを選択するか、フレームワークを選択しないかは、コンテキストに基づいて決定する必要があります。

うまくいけば、この記事の終わりまでに、JavaのSpringに関してこの決定を下すことができるようになるでしょう。

3. 春の生態系の概要

Springフレームワークの定性的評価を開始する前に、Springエコシステムがどのように見えるかを詳しく見てみましょう。

Springは、Java Enterprise Editionが急速に進化し、エンタープライズアプリケーションの開発がエキサイティングでありながら退屈だった2003年のどこかで誕生しました。

Springは、 Java の制御の反転(IoC)コンテナとして始まりました。 私たちは今でもSpringを主にそれに関連付けており、実際、Springはその上で開発されたフレームワークやその他のプロジェクトの中核を形成しています。

3.1. Spring Framework

Springフレームワークはモジュールに分割されているため、あらゆるアプリケーションで使用するパーツを簡単に選択できます。

  • コア:DI(依存性注入)、国際化、検証、AOP(アスペクト指向プログラミング)などのコア機能を提供します
  • データアクセス:JTA(Java Transaction API)、JPA(Java Persistence API)、およびJDBC(Java Database Connectivity)を介したデータアクセスをサポートします
  • Web :サーブレットAPI( Spring MVC )と最近のReactive API( Spring WebFlux )の両方をサポートし、さらにWebSocket、STOMP、およびWebClientをサポートします
  • Integration :JMS(Java Message Service)、JMX(Java Management Extension)、およびRMI(Remote Method Invocation)を介したEnterpriseJavaへの統合をサポートします
  • テスト:モックオブジェクト、テストフィクスチャ、コンテキスト管理、キャッシングによるユニットテストと統合テストの幅広いサポート

3.2. 春のプロジェクト

しかし、Springをはるかに価値のあるものにしているのは、何年にもわたって成長し、活発に進化し続けている強力なエコシステムです。 これらは、Springフレームワーク上で開発されたSpringプロジェクトとして構成されています。

Springプロジェクトのリストは長く、変化し続けていますが、言及する価値のあるものがいくつかあります。

  • Boot :Springをベースにしたさまざまなプロジェクトを短時間で作成するための、非常に意見が豊富で拡張可能なテンプレートのセットを提供します。 これにより、Tomcatまたは同様のコンテナが組み込まれたスタンドアロンのSpringアプリケーションを非常に簡単に作成できます。
  • クラウド:サービス検出、サーキットブレーカー、APIゲートウェイなどの一般的な分散システムパターンのいくつかを簡単に開発するためのサポートを提供します。 これにより、このような定型パターンをローカル、リモート、さらには管理対象プラットフォームに展開する労力を削減できます。
  • セキュリティ:高度にカスタマイズ可能な方法でSpringに基づくプロジェクトの認証と承認を開発するための堅牢なメカニズムを提供します。 最小限の宣言型サポートにより、セッション固定、クリックジャッキング、クロスサイトリクエストフォージェリなどの一般的な攻撃から保護されます。
  • モバイル:デバイスを検出し、それに応じてアプリケーションの動作を適応させる機能を提供します。 さらに、最適なユーザーエクスペリエンス、サイト設定管理、およびサイトスイッチャーのためのデバイス対応ビュー管理をサポートします。
  • Batch :データアーカイブなどのエンタープライズシステム用のバッチアプリケーションを開発するための軽量フレームワークを提供します。 スケジューリング、再起動、スキップ、メトリックの収集、およびロギングを直感的にサポートします。 さらに、最適化とパーティション分割により、大量のジョブのスケールアップをサポートします。

言うまでもなく、これはSpringが提供するものの非常に抽象的な紹介です。 しかし、それは私たちの議論をさらに進めるためにSpringの組織と幅に関して私たちに十分な根拠を提供します。

4. Spring in Action

新しいテクノロジーを理解するために、hello-worldプログラムを追加するのが通例です。

Springが、hello-world以上のことを実行するプログラムを作成するための簡単な方法を作成する方法を見てみましょう。 インメモリデータベースに支えられたEmployeeなどのドメインエンティティのRESTAPIとしてCRUD操作を公開するアプリケーションを作成します。 さらに、基本認証を使用してミューテーションエンドポイントを保護します。 最後に、古き良き単体テストがなければ、アプリケーションを完全に完成させることはできません。

4.1. プロジェクトの設定

Spring Initializr を使用してSpring Bootプロジェクトをセットアップします。これは、適切な依存関係を持つプロジェクトをブートストラップするための便利なオンラインツールです。 Maven構成を正しくセットアップするために、プロジェクトの依存関係としてWeb、JPA、H2、およびセキュリティを追加します。

ブートストラップの詳細については、以前の記事の1つを参照してください。

4.2. ドメインモデルと永続性

やるべきことはほとんどないので、ドメインモデルと永続性を定義する準備ができています。

まず、Employeeを単純なJPAエンティティとして定義しましょう。

@Entity
public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    @NotNull
    private String firstName;
    @NotNull
    private String lastName;
    // Standard constructor, getters and setters
}

エンティティ定義に含めた自動生成IDに注意してください。

次に、エンティティのJPAリポジトリを定義する必要があります。 これは、Springがそれを本当にシンプルにするところです:

public interface EmployeeRepository 
  extends CrudRepository<Employee, Long> {
    List<Employee> findAll();
}

このようなインターフェースを定義するだけで、 Spring JPAは、デフォルトおよびカスタム操作で具体化された実装を提供します。 かなりきちんと! Spring Data JPA の操作の詳細については、他の記事を参照してください。

4.3. コントローラ

次に、着信要求をルーティングおよび処理するためのWebコントローラーを定義する必要があります。

@RestController
public class EmployeeController {
    @Autowired
    private EmployeeRepository repository;
    @GetMapping("/employees")
    public List<Employee> getEmployees() {
        return repository.findAll();
    }
    // Other CRUD endpoints handlers
}

実際、私たちがしなければならなかったのは、クラスに注釈を付け、各ハンドラーメソッドとともにルーティングメタ情報を定義することだけでした。

Spring RESTコントローラーの操作については、前回の記事で詳しく説明しています。

4.4. 安全

これですべてを定義しましたが、従業員の作成や削除などの操作を保護するのはどうでしょうか。 これらのエンドポイントへの認証されていないアクセスは望ましくありません。

Spring Securityは、この分野で本当に輝いています。

@EnableWebSecurity
public class WebSecurityConfig 
  extends WebSecurityConfigurerAdapter {
 
    @Override
    protected void configure(HttpSecurity http) 
      throws Exception {
        http
          .authorizeRequests()
            .antMatchers(HttpMethod.GET, "/employees", "/employees/**")
            .permitAll()
          .anyRequest()
            .authenticated()
          .and()
            .httpBasic();
    }
    // other necessary beans and definitions
}

ここには詳細を理解する必要があるがありますが、注意すべき最も重要な点はGET操作のみを無制限に許可した宣言型です。

4.5. テスト

これですべてが完了しましたが、待ってください。これをどのようにテストしますか?

Springを使用すると、RESTコントローラーの単体テストを簡単に作成できるかどうかを見てみましょう。

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc
public class EmployeeControllerTests {
    @Autowired
    private MockMvc mvc;
    @Test
    @WithMockUser()
    public void givenNoEmployee_whenCreateEmployee_thenEmployeeCreated() throws Exception {
        mvc.perform(post("/employees").content(
            new ObjectMapper().writeValueAsString(new Employee("First", "Last"))
            .with(csrf()))
          .contentType(MediaType.APPLICATION_JSON)
          .accept(MediaType.APPLICATION_JSON))
          .andExpect(MockMvcResultMatchers.status()
            .isCreated())
          .andExpect(jsonPath("$.firstName", is("First")))
          .andExpect(jsonPath("$.lastName", is("Last")));
    }
    // other tests as necessary
}

ご覧のとおり、 Springは、初期化および構成するSpringコンテキストに依存する単純なユニットテストと統合テストを作成するために必要なインフラストラクチャを提供します。

4.6. アプリケーションの実行

最後に、このアプリケーションをどのように実行しますか? これは、SpringBootのもう1つの興味深い側面です。 これを通常のアプリケーションとしてパッケージ化し、従来はサーブレットコンテナにデプロイできますが。

でも、これはどこが楽しいのか! Spring BootにはTomcatサーバーが組み込まれています

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

これは、ブートストラップの一部として事前に作成されたクラスであり、組み込みサーバーを使用してこのアプリケーションを起動するために必要なすべての詳細が含まれています。

さらに、これは高度にカスタマイズ可能です

5. 春の代替案

フレームワークを使用することを選択することは比較的簡単ですが、フレームワークから選択することは、私たちが持っている選択でしばしば気が遠くなることがあります。 ただし、そのためには、Springが提供する機能にどのような選択肢があるかを少なくとも大まかに理解する必要があります。

前に説明したように、 Springフレームワークとそのプロジェクトは、エンタープライズ開発者がから選択できる幅広い選択肢を提供します。 現代のJavaフレームワークを簡単に評価すると、Springが提供するエコシステムにさえ近づきません。

ただし、特定の分野では、代替案として選択する説得力のある議論が形成されます。

  • Guice :Javaアプリケーション用の堅牢なIoCコンテナーを提供します
  • Play :リアクティブサポートを備えたWebフレームワークとして非常に適切に適合します
  • Hibernate :JPAをサポートするデータアクセスのための確立されたフレームワーク

これら以外にも、特定のドメインよりも幅広いサポートを提供するが、Springが提供するすべてのものをカバーしていない最近の追加がいくつかあります。

  • Micronaut :クラウドネイティブのマイクロサービス向けに調整されたJVMベースのフレームワーク
  • Quarkus :より高速な起動時間とより小さなフットプリントを提供することを約束する新時代のJavaスタック

明らかに、リストを完全に繰り返す必要はなく、実行可能でもありませんが、ここで大まかなアイデアを得ることができます。

6. では、なぜ春を選ぶのですか?

最後に、中心的な質問に対処するために必要なすべてのコンテキストを構築しました。なぜSpringなのですか? フレームワークが複雑なエンタープライズアプリケーションの開発にどのように役立つかを理解しています。

さらに、特にJavaの場合、Web、データアクセス、フレームワークの観点からの統合など、特定の懸念事項に対して私たちが持っているオプションを理解しています。

さて、これらすべての中で春はどこで輝いていますか? 探検しましょう。

6.1. 使いやすさ

フレームワークの人気の重要な側面の1つは、開発者がフレームワークを簡単に使用できることです。 複数の設定オプションと設定より規約を利用することで、開発者は開始して、必要なものを正確に設定することが非常に簡単になります

Spring Bootのようなプロジェクトは、複雑なSpringプロジェクトのブートストラップをほとんど簡単にしました。 言うまでもなく、誰もが参加できるようにするための優れたドキュメントとチュートリアルがあります。

6.2. モジュール性

Springの人気のもう1つの重要な側面は、その高度にモジュール化された性質です。 Springフレームワーク全体を使用するか、必要なモジュールのみを使用するかを選択できます。 さらに、必要に応じて、オプションで1つ以上のSpringプロジェクトを含めることができます

さらに、HibernateやStrutsなどの他のフレームワークを使用するオプションもあります。

6.3. 適合性

SpringはすべてのJakartaEE仕様をサポートしているわけではありませんが、すべてのテクノロジーをサポートしており、必要に応じて標準仕様よりもサポートが向上することがよくあります。 たとえば、SpringはJPAベースのリポジトリをサポートしているため、プロバイダーを切り替えるのは簡単です。

さらに、Springは、SpringWebReactiveのReactiveStreamSpringHATEOASのHATEOASなどの業界仕様をサポートしています。

6.4. 妥当性

フレームワークの採用は、その上に構築されたアプリケーションをテストすることがいかに簡単であるかという事実にも大きく依存します。 Spring at the core は、テスト駆動開発(TDD)を提唱し、サポートしています。

Springアプリケーションは主にPOJOで構成されているため、単体テストが比較的簡単になります。 ただし、Springは、単体テストが複雑になるMVCのようなシナリオにモックオブジェクトを提供します。

6.5. 成熟

Springには、革新、採用、標準化の長い歴史があります。 何年にもわたって、大規模なエンタープライズアプリケーションの開発で直面する最も一般的な問題のデフォルトソリューションになるのに十分なほど成熟してきました。

さらにエキサイティングなのは、それがどれほど積極的に開発され、維持されているかです。 新しい言語機能とエンタープライズ統合ソリューションのサポートは、毎日開発されています。

6.6. コミュニティサポート

大事なことを言い忘れましたが、フレームワークやライブラリでさえ、イノベーションを通じて業界を生き残り、コミュニティほどイノベーションに適した場所はありません。 Springは、Pivotal Softwareが主導するオープンソースであり、組織や個々の開発者の大規模なコンソーシアムが支援しています。

これは、その傘下にあるプロジェクトの数から明らかなように、それが文脈的でしばしば未来的なままであることを意味しています。

7. 使用しない理由Spring

さまざまなレベルのSpringの使用法から恩恵を受けることができるさまざまなアプリケーションがあり、Springが成長するにつれて変化します。

ただし、Springは、他のフレームワークと同様に、アプリケーション開発の複雑さを管理するのに役立つことを理解する必要があります。 これは、一般的な落とし穴を回避し、アプリケーションが時間の経過とともに成長しても保守しやすくするのに役立ちます。

このには、追加のリソースフットプリントと学習曲線が犠牲になりますが、それは小さいかもしれません。 十分に単純で複雑になることが予想されないアプリケーションが実際にある場合は、フレームワークをまったく使用しない方がメリットがあるかもしれません。

8. 結論

この記事では、アプリケーション開発でフレームワークを使用する利点について説明しました。 特にSpringFrameworkについても簡単に説明しました。

このテーマについては、Javaで利用可能な代替フレームワークのいくつかについても調べました。

最後に、JavaのフレームワークとしてSpringを選択せざるを得ない理由について説明しました。

ただし、この記事はアドバイスのメモで終了する必要があります。 説得力があるように聞こえるかもしれませんが、通常、ソフトウェア開発には単一の万能ソリューションはありません。

したがって、私たちが解決しようとしている特定の問題に対して最も単純な解決策を選択する際に、私たちの知恵を適用する必要があります。