19
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Struts経験者がSpringで困惑したポイントまとめ(初心者向け)

19
Posted at

執筆のきっかけ

プログラミングって何?という全くの未経験状態からJavaのStrutsを触り始め、そこからSpringで開発することになりました:computer:

始めはStrutsを使って経験を積んでいたこともあり、
「同じJavaならフレームワークが異なるSpringも流れですぐ理解できるだろう」
と思って業務に入ることとなりました。

しかし実際には、想像以上に違いが多く、かなり混乱したことを記憶しています。

特に最初は「何がどう違うのか」が整理できず、理解が追い付きませんでした。

この記事では、Struts経験者の視点から、Springで困惑したポイントを初心者向けにまとめてみました:pencil:


前提

以下のレベル感の方を想定した記事です。

  • Strutsでの開発経験あり
  • Springは初学者レベル

困惑①:Actionが行方不明...Controllerって?

Strutsでは、リクエストを受け取る処理の中心はActionクラスでした。

public class LoginAction extends Action {
    public ActionForward execute(...) {
        // ログイン処理など
    }
}

一方で、SpringではControllerがその役割を担います。

@Controller
public class LoginController {

    @RequestMapping("/login")
    public String login() {
        // ログイン処理など
    }
}

ざっくりとした違いのイメージ

  • Struts:configファイル + Action中心
  • Spring:Controller + アノテーション

現場でのつまづき

最初に既存のSpringプロジェクトを見たとき、
「どこから処理が始まってるのか分からない」問題に直面したのを覚えています。

Strutsだと設定ファイルを見ればなんとなくの流れが追えますが、
Springはアノテーションで分散しているため、最初は全体像が見えにくいと感じたのが正直な感想です:thinking:


困惑②:設定ファイルの違い

Strutsでは、struts-config.xmlに設定をまとめて書いていました。

<!-- フォームビーン -->
<form-beans>
    <!-- formの定義 (name, type等) -->
</form-beans>

<!-- アクションマッピング -->
<action-mappings>
    <!-- actionの定義 (name, path, type, input等) -->
    <!-- forwardの定義 (name, path等) -->
</action-mappings>

<!-- メッセージリソース -->
    <!-- message-resourcesの定義 (parameter等) -->    

Springでは、アノテーションの設定がベースです。

@Controller
@RequestMapping("/login")
public class LoginController {

    @ModelAttribute("loginForm")
    public LoginForm setUpForm() {
        return new LoginForm();
    }

    @PostMapping
    public String login(
            @ModelAttribute("loginForm") LoginForm form,
            BindingResult result) {
            //ログイン処理
    }
}

ざっくりとした違いのイメージ

  • Struts:XMLで一元管理
  • Spring:設定をコード上で管理

現場でのつまづき

設定ファイルが基本的になく、クラスごとに設定が分かれているため、

「このURLってどこのControllerに紐づいてる?」

と、コードを探し回ることに時間がかかってしまいました:dizzy_face:


困惑③:newしないのに動くのはなぜ?

Strutsでは、必要なオブジェクトは各自で生成するのが当たり前でした。

UserService service = new UserService();

しかしSpringでは、@Autowired を使って依存性注入(DI)します。

@Autowired
UserService service;

ざっくりとしたポイント

  1. newしていないのに、なぜインスタンスが存在するのか?
    • Springがインスタンスを自動生成し管理を行っているイメージ
    • インスタンス生成の定義を毎回行う必要はなく、「宣言するだけでOK」
  2. DIの考え方
    • Strutsでは各自で「手動生成」を行うことが当然だっただが、
      Springではフレームワークに「管理を任せる」ことになるイメージ

現場でのつまづき

@Autowiredを付け忘れてNullPointerExceptionが多発…。
基礎的な誤りが多く、よく𠮟られていました:innocent:


困惑④:画面遷移がシンプルすぎる

Strutsではforward設定で画面遷移を行います。

<forward name="success" path="/home.jsp"/>

Springでは戻り値で遷移先を指定します。

return "/home.html";

ざっくりとした違いのイメージ

  • Struts:遷移先をXMLで明示的に定義
  • Spring:コードベースで遷移先を指定

現場でのつまづき

Strutsのように設定が集約されたファイルを管理しているわけではないため、
遷移先の紐づきを理解するのに苦労しました。
Springでは、実際にはViewResolverなどが裏で動いていると後で理解し、
見えない処理が多いことに戸惑うのもSpringの特徴だと感じた瞬間でした:confused:


学んだこと

StrutsとSpringは考え方が異なると痛感しました。

特に重要だと感じたのは以下の2点です。

  • DI(依存性注入)の理解
  • アノテーションベースの設計への慣れ

また、Springは便利な分、「裏で何が動いているか」を意識する必要があると感じました:slight_smile:


おわりに

最初は戸惑うことも多いと思いますが、
理解が進むとSpringの柔軟さや生産性の高さを実感できます。

同じようにStrutsからSpringへ移行している方の参考になれば嬉しいです:pray:

19
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?