【Java比較で理解】StrutsとSpring Bootの違いを体系的に整理してみた

【比較で理解】**Struts**と**Spring Boot**の違いを体系的に整理してみた

- [はじめに](#はじめに)
    - [1. アーキテクチャの基本思想](#1-アーキテクチャの基本思想)
    - [2. フォルダ構成とファイル管理](#2-フォルダ構成とファイル管理)
    - [3. 実装スタイルの違い](#3-実装スタイルの違い)
    - [4. バリデーションとデータバインディング](#4-バリデーションとデータバインディング)
    - [5. URLルーティングとリクエスト処理](#5-URLルーティングとリクエスト処理)
    - [6. パフォーマンスとリソース使用量](#6-パフォーマンスとリソース使用量)
    - [7. テストのしやすさ](#7-テストのしやすさ)
    - [8. モダン開発との親和性](#8-モダン開発との親和性)
    - [9. セキュリティ](#9-セキュリティ)
    - [10. まとめ](#10-まとめ)
- [なぜSpring Bootが主流になったのか？](#なぜspring-bootが主流になったのか)
- [おわりに](#おわりに)

## はじめに

StrutsはかつてJava Webアプリケーション開発の標準的なフレームワークでしたが、今やその地位は**Spring Boot**に移りつつあります。

本記事では、**StrutsとSpring Bootの違いを体系的に比較**し、以下の疑問に答えます。

・なぜSpring Bootが主流になったのか？
・Strutsとの明確な違いは何か？
・それぞれどんな特徴があるのか？
※本記事ではStruts1を前提としています

## 1. アーキテクチャの基本思想

|項目|Struts|Spring Boot|
|----|------|-----------|
|中核アーキテクチャ|ActionベースMVC|Spring FrameworkベースのDI＋アノテーション中心のMVC|
|設定スタイル|XML設定中心|Java Config+アノテーション|
|DI(依存性注入)|外部ライブラリ依存|Spring Frameworkとして標準対応|
|開発の指針|明示的・静的|設定より規約|



## 2. フォルダ構成とファイル管理
### Struts(従来構成)
    src/
    ├── main/
    │   ├── java/
    │   │   ├── action/
    │   │   └── form/
    │   └── webapp/
    │       ├── WEB-INF/
    │       │   ├── struts-config.xml
    │       │   └── web.xml
    │       └── jsp/

### Spring Boot(標準構成)
    src/
    ├── main/
    │   ├── java/
    │   │   └── com/example/
    │   │       ├── controller/
    │   │       ├── service/
    │   │       └── repository/
    │   └── resources/
    │       ├── application.properties
    │       └── templates/  # テンプレートエンジン使用時（Thymeleaf等）
---

## 3. 実装スタイルの違い
### Struts（ユーザー登録）

```Java
public class RegisterAction extends Action {
    
    public ActionForward execute
          (ActionMapping mapping,                 // ← struts-config.xmlで定義が必要
           ActionForm form,                       // ← struts-config.xmlで定義が必要
           HttpServletRequest request,
           HttpServletResponse response
          ) throws Exception {
        UserForm f = (UserForm) form;
        //ロジック
        return mapping.findForward("success");    // ← struts-config.xmlで定義が必要
    }
}
```    
### struts-config.xml
```xml
xml<!-- ★ 上記Javaコードの動作に必須のstruts-config.xml -->
<struts-config>
    <form-beans>
        <form-bean name="userForm" type="com.example.UserForm"/>
    </form-beans>
    
    <action-mappings>
        <action path="/register" 
                type="com.example.RegisterAction"
                name="userForm"
                scope="request">
            <forward name="success" path="/success.jsp"/>>
        </action>
    </action-mappings>
</struts-config>
```



### Spring boot（ユーザー登録）
```Java
@RestController
@RequestMapping("/users")
public class UserController {

    @PostMapping("/register")
    public ResponseEntity<String> register(@RequestBody @Valid UserDto dto) {
        //ロジック
        return ResponseEntity.ok("success");
    }
}
```

### 違いのポイント
・Strutsは「Action＋Form＋XML」ベース
・Spring Bootは「Controller＋DTO＋アノテーション」ベース
・StrutsはActionクラスの作成やXMLベースの設定、Formクラスとの連携など複数のファイルや構成要素が必要となるため記述が冗長になりがちです。
特に`struts-config.xml`への設定依存が強く、保守・追跡が困難になることがあります。


## 4. バリデーションとデータバインディング

|機能|Struts|Spring Boot|
|---|---|---|
|フォームオブジェクト|ActionForm（継承必須）|任意のPOJO/DTOクラス|
|バリデーション方式|Commons Validator+XML設定|Bean Validation（@Valid等）＋アノテーション|
|柔軟性|制限あり（ActionForm継承が必要）|高い（任意のJava Beanが使用可能）|

バリデーション機能の違いは開発効率に直結します。StrutsのCommons Validator + XML設定は、バリデーションルールが分散しがちで、フォーム追加時の設定漏れが発生しやすい構造です。一方、Spring BootのBean Validationは、DTOクラス内にアノテーションでバリデーションを記述できるため、ビジネスロジックとの結合度が高く、保守性に優れています。特に大規模開発では、この差が顕著に現れます。

## 5. URLルーティングとリクエスト処理

|比較軸|Struts|Spring Boot|
|---|---|---|
|URLルーティング設定|struts-config.xmlで定義|@RequestMapping,@GetMapping等|
|フォワード先管理|ActionForward|return View名 or RESTでJSON返却|
|REST対応|Struts 1では非対応／Struts 2では限定対応|標準対応(Spring WebMVC)|

URLルーティングの仕組みの違いは、API設計の柔軟性に大きく影響します。StrutsのXMLベース設定では、新しいエンドポイント追加時に設定ファイルとJavaコードの両方を修正する必要があり、設定ミスのリスクが高まります。Spring Bootのアノテーションベースでは、Controllerクラス内で完結するため、開発者の認知負荷が軽減され、REST APIの実装も直感的に行えます。

## 6. パフォーマンスとリソース使用量
|項目|Struts|Spring Boot|
|---|---|---|
|起動時間|依存するコンテナ次第だが比較的速い|やや遅い（Springの自動構成が入るため）|
|メモリ使用量|軽量|やや重い|
|実行時パフォーマンス|良好|良好（最適化済み）|

パフォーマンス面では一長一短があります。Strutsは軽量で起動が速い反面、機能拡張時に外部ライブラリへの依存が増加し、結果的にアプリケーション全体が重くなる傾向があります。Spring Bootは初期のメモリ使用量は多めですが、統合されたエコシステムにより、機能追加時の追加オーバーヘッドは比較的少なく抑えられます。本番環境では、この特性の違いが運用コストに影響する場合があります。

## 7. テストのしやすさ

|比較軸|Struts|Spring Boot|
|---|---|---|
|単体テストのしやすさ|DIがないため工夫が必要|@MockBean,@WebMvcTest等|
|モック対応|難しい|容易（Mockito等と相性良い）|
|自動テストサポート|限定的|Spring Test, JUnit5等との統合が用意|


## 8. モダン開発との親和性

|項目|Struts|Spring Boot|
|---|---|---|
|REST API|△(対応可能だが面倒)|◎(対応が容易)|
|JSONレスポンス|外部ライブラリが必要|標準搭載(Jackson)|
|非同期処理|可能だがフレームワークによるサポートは乏しい|@Asyncなどで簡単|
|クラウドネイティブ対応|難しい|Spring Cloudなどとの統合あり|

## 9. セキュリティ
|項目|Struts|Spring Boot|
|---|---|---|
|セキュリティサポート|EOL（End of Life）により脆弱性対応停止|Spring Securityとの統合で強固|
|CSRF対応|手動実装が必要|標準で対応|
|脆弱性への対応|2013年にサポート終了|活発にメンテナンス継続|

セキュリティ面での差は、現代のWebアプリケーション開発において致命的な違いとなっています。Struts 1のサポート終了により、新たな脆弱性が発見されても修正されないリスクが存在します。Spring Bootは活発にメンテナンスされ、Spring Securityとの統合により、認証・認可・CSRF対策などが標準で提供されています。企業システムでは、このセキュリティサポートの継続性が技術選択の重要な判断材料となります。

## 10. まとめ
|観点|Struts|Spring Boot|
|---|---|---|
|学習コスト|低～中|中～高（Spring Framework全体の理解が必要)|
|柔軟性|限定的|高い|
|保守性|△（設定ファイル分散・コードと設定の分離による複雑化）|◎（設定の一元化・アノテーションベース）|
|エコシステム|ほぼ停止|非常に活発|
|推奨される用途|レガシーシステムの延命|新規開発・モダン化|

・Strutsは、XML設定による明示的な制御を特徴とするMVCベースのWebアプリケーションフレームワークです。一方、Spring Bootは設定より規約の思想に基づき、迅速な開発を可能にするSpringベースのフレームワークです。

※ほぼ停止の理由: Strutsは完全に停止しているわけではなく、セキュリティ修正等は継続されている。
## なぜSpring Bootが主流になったのか？

これまで1-10の比較を行い、各フレームワークの違いを見てきました。
その結果を加味しSpring Bootが主流となった理由は、現代のソフトウェア開発課題への具体的解決策を提供しているからです。

決定的な4つの要因:
・設定の簡素化 - 複雑なXML設定からアノテーションベースへ
・モダン開発対応 - マイクロサービス、REST API、クラウドネイティブ
・開発生産性 - 高速開発とテスト容易性の実現
・継続的進化 - 活発なコミュニティとセキュリティ対応

これらによりSpring BootはJava Web開発の新しいスタンダードとして確立されました。



## おわりに
これまで記述してきた通りStrutsとSpring Bootの構造や開発体験には大きな違いがあります。

特に下記のようなケースではSpring Bootの採用・移行がおすすめです。
・保守性・拡張性を重視する
・REST APIやモダンなUIと連携したい
・テストやCI/CDを整備したい



>参考
https://stackshare.io/stackups/apache-struts-vs-spring-boot
https://www.orientsoftware.com/blog/struts-vs-spring/

## 関連記事

- [JAVA / Spring と Spring Boot の違いとは？](https://qiita.com/e-tak/items/475e956103b1fdf05775)