Spring
2021.09.30
【5分でわかる】Spring MVC入門! Bootとの違いや特徴、サンプルまで解説!
2023.11.18

1.MVCとは


MVCとはWebアプリの開発におけるアーキテクチャのひとつで、Webアプリのプログラムをその名の通りM(model)、V(view)、C(Controller)に分けてコーディングをしていくという考え方です。ユーザーにUIを提供するインターフェイスと内部データを処理・操作する二つの役割に分れたシステム構造です。


MVCは仕組みや機能というよりはプログラム開発の考え方・管理手法で、ルールに則って役割ごとに意味のある単位で機能をセット・管理していくことにより開発が円滑になります。JavaのSpring MVCに限らず、PythonのDjangoやPHPのLaravelといった様々な言語のフレームワークがこのMVCアーキテクチャを採用しています。

1-1.Model

Modelの役割は主にデータベースとのデータのやりとりを行う、データベースから取得したデータをプログラムで使いやすいように取り出し変換する、といったものです。具体的なクラスではユーザーアカウント情報など動的なデータ構造を持つ、POJO(Plain Old Java Object)やEntityがこれに該当します。

1-2.View

ViewはユーザーとWebサイトとのインターフェイスで、入出力の表示だけでなく、レイアウトやボタンなどの動作部分を提供するのも役割のひとつです。サーバーサイドで処理されたデータを動的にユーザーに表示するための処理も担い、Webブラウザに対してHTMLを表示します。Spring MVCではThymeleaf(タイムリーフ)を使ったHTMLテンプレートファイルが該当し、他のプログラミング言語にもHTMLを動的に表示するテンプレートエンジンが存在します。

1-3.Controller

ControllerはModelとViewのそれぞれの処理をアプリとして連携させるために、司令塔・橋渡し役といった役割を担います。ユーザーが入力した情報に基づいて、モデルへはデータを取り出す指示を、ビューにはモデルで取り出したデータを元に画面を表示する指示を出します。ただし処理の記載場所の整理をしないと、 何でも屋のControllerにコードが集中しやすくなりFat controllerと言われることがあるので、注意が必要です。


MVCを利用してWebアプリを開発するメリットは役割を分けることで作業効率、管理効率が向上すること、またMVCの考え方やお約束に従って開発を進めることで他の誰から見てもわかりやすいプログラムになることなどが挙げられます。複数メンバーによる分業開発では多くのチームで採用されているアーキテクチャですので、是非理解して使えるようになりましょう。



2.Spring MVCとは


前項ではMVC各要素のそれぞれの役割について説明しました。これらの三つが合わさることでMVC全体の流れとして、ユーザーからのリクエストがControllerに渡される、Modelがデータベースと通信しデータを動的に得る、動的なデータがViewに渡されその結果をユーザーが見ることができる、といったように下図のように連携した処理が動かされます。

Spring MVCで使用されるMVCはFront Controllerパターンというタイプに分類されます。

下図のように中央のFront Controllerがすべてのリクエストを一旦受けとって処理の中継をすることで、ユーザーからのリクエストを適切なコントローラに引き継いでいきます。

このFront ControllerはSpring MVCが管理しているので、開発する上ではその処理内容を意識する必要があまりありません。一方、コーディングを進める際に意識する必要があるのは、基本的なModel、View、Controllerの役割分担です。

図の引用:Spring Boot + Spring MVC ~サンプルアプリ実装~

(https://qiita.com/t-shin0hara/items/687085ec34ae78ca2260)


3.Spring MVCの特徴

3-1.POJO(Plain Old Java Object)による実装

Spring MVCではControllerやModelのクラスをPOJOとして実装できます。POJOとはあるJavaオブジェクトがEJBのような特殊なクラスではなく、ごく普通のJavaオブジェクトであり特定のフレームワーク以外でも使用することができるという意味です。これによりフレームワークへの依存度が減り、単体テストも実装しやすくなります。

3-2.アノテーションによる定義情報の管理

アノテーションが採用されているため、クラス定義が簡単にできます。例を挙げるとControllerクラスを作成するためにControllerインターフェイスをimplementsする必要がなくなりクラスに@Controllerアノテーションを宣言するだけになります。また、ロジックに関連する情報をxmlに記載することなくJavaファイル内で管理を統一できるため、コーディングがシンプルになり効率的に開発できます。

3-3.柔軟なメソッドシグネチャの定義

Controllerクラスのメソッドの引数に指定できるさまざまな型がデフォルトでサポートされており、フレームワーク側で自動的に引数に渡す値の型をよしなに解決してくれます。これにより仕様変更やリファクタリングに強いアーキテクチャになります。

3-4.ServletAPIを抽象化する仕組み

Spring MVCはServletAPI(ServletRequest,SurvletResponse,SurvletSessyonなど)を抽象化できます。Controllerクラスの実装においてAPIの処理に関する記述を減らせるため、作成するクラスのテストがしやすくなります。

3-5.Viewの実装技術を抽象化する仕組み

MVCではControllerがViewの論理名を返却して、フレームワークが返却するViewを決めます。よってControllerはViewの名前だけを記載すればViewの実装技術(JSP,ServletAPI,Thymeleaf)を意識する必要がなく、開発がスムーズになります。

3-6.SpringのDIコンテナとの連携が可能

Spring MVCはSpringのDIコンテナ上で動作するフレームワークです。そのためSpringのもつDIやAOPなどの仕組みを活用でき、アプリ開発を効率的に進められます。

3-7.サードパーティーライブラリとの連携

Spring MVCではサードバーティーライブラリを使うためのアダプタが多数用意されています。これらはThymeleaf(テンプレートエンジン)などと組み合わせて使うことが可能で、優れた拡張性を持ちます。


4.Spring BootとSpring MVCの違い


Spring MVCはSpring Project群に備わっている様々な機能を組み合わせたり、サードパーティーのライブラリを利用したりすることで、細やかな仕様変更や多様な開発プロジェクトに柔軟に対応できる非常に便利なフレームワークです。


一方で、この特徴である拡張性・多様性から提供される機能は非常に多く、Spring Projects全体を把握して最適な解を選び出すことを難しくしています。また、プロジェクトの初期設定・環境構築がPHPやRuby等多言語と比べると複雑であり、チーム開発・個人開発どちらの場合でも準備に手間と時間がかかる習得難易度は高いフレームワークともいえます。


Spring BootはこれらのSpring MVCの難点を解消してくれるフレームワークで、実際に触ってみるとJava初心者向けで比較的フレンドリーであることがすぐに分かるはずです。プロジェクト開始時にWebアプリの構築に必要な設定やSpringパッケージが予めデフォルトで設定されており、最低限の選択を行うだけで一般的なアプリに必要な環境構築ができます。またアプリケーションの内部に組み込みのアプリケーション・サーバー(Tomcat)を内包しているためサーバーの構築も不要です。


Spring BootはSpring MVC(Spring)の仕組み・考え方を引き継ぎながらも、Spring MVCの難点である初期設定の手間・高い自由度による問題を解決してくれているフレームワークと言えます。


5.Spring MVCのサンプルアプリケーション


それでは、Spring MVCで簡単なアプリを作る方法を一緒に見てみましょう。

作成するアプリは、次の画像のようなフォームに、文字を入力すると メッセージを返す、いわゆるエコーアプリです。

・入力画面

・出力画面

5-1.プロジェクト新規作成

使用しているIDE(SpringSource Tool Suiteなど)のメニューからSpring MVCプロジェクトを作成しましょう。プロジェクト名はHello Worldで、パッケージ名はcom.example.helloworld”とします。


設定ファイル(src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml)はデフォルトのままで大丈夫です。

5-2.Modelの作成

MVCのデータ格納オブジェクトであるModelとしてEchoFormクラスを作成しましょう。

今回はnameというプロパティを1つだけ持つ、単純なPOJOです。

package com.example.helloworld.echo;

import java.io.Serializable;

public class EchoForm implements Serializable {
    private static final long serialVersionUID = 2557725707095364445L;

    private String name;

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

5-3.Controllerの作成

MVCの司令塔であるControllerは以下のようにしましょう。

三つほどメソッドがあるので、以下順に読み進めてください。


(1)@ModelAttribute というアノテーションを付加することでメソッドの返り値は、

 自動でModel(echoForm)に追加されます。


(2)@RequestMapping アノテーションによりマッピングされ、

 <contextPath>/echo”にアクセスすると、 index メソッドが呼ばれます。


(3)引数には(1)でModelに追加されたEchoFormオブジェクトが渡さます。


(4)View(echo/index)を返し、WEB-INF/views/echo/index.jspがレンダリングされます。


(5)@RequestMapping アノテーションでhelloを指定しているので、 

 <contextPath>/echo/hello”にアクセスすると hello メソッドが呼ばれます。


(6)フォームで入力された name を、Viewにそのまま渡します。

package com.example.helloworld.echo;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("echo")
public class EchoController {

    @ModelAttribute // (1)
    public EchoForm setUpEchoForm() {
        EchoForm form = new EchoForm();
        return form;
    }

    @RequestMapping // (2)
    public String index(Model model) {
        return "echo/index"; // (4)
    }

    @RequestMapping("hello") // (5)
    public String hello(EchoForm form, Model model) {// (3)
        model.addAttribute("name", form.getName()); // (6)
        return "echo/hello";
    }
}

5-4.Viewの作成

ユーザーに表示するViewとして入力画面と出力画面のJSPを作成しましょう。

入力画面で入力したnameがController経由で出力画面に渡されて表示されます。c:out タグにより、XSS対策が行われています。


入力画面 src/main/webapp/WEB-INF/views/echo/index.jsp

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<!DOCTYPE html>
<html>
<head>
<title>Echo Application</title>
</head>
<body>
  <!-- (1) -->
  <form:form modelAttribute="echoForm" action="${pageContext.request.contextPath}/echo/hello">
    <form:label path="name">Input Your Name:</form:label>
    <form:input path="name" />
    <input type="submit" />
  </form:form>
</body>
</html>

出力画面 src/main/webapp/WEB-INF/views/echo/hello.jsp

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<!DOCTYPE html>
<html>
<head>
<title>Echo Application</title>
</head>
<body>
  <p>
    Hello <c:out value="${name}" />!
  </p>
</body>
</html>

これでMVCが揃いエコーアプリは完成です、実際のアプリではモデルがデータベースと連携するなど複雑にはなりますが、ControllerがModelをViewに渡すという流れが今回のアプリで理解出来れば十分です。参考リンクではバリデーションの実装や設定ファイルについても説明されていますので、気になる方はリンクより詳細確認して勉強してみてください。

(参考)TERASOLUNA Global Framework Development Guideline

https://terasolunaorg.github.io/guideline/public_review/Overview/FirstApplication.html



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


ここまでSpring MVCに関して紹介してきましたが、実際にシステム開発を行う場合は、フレームワーク以外の他のスキルや知識も必要となります。チーム開発になれば役割分担もあるので、全てを自分でできなくても良い場合はありますが、最低限抑えておきたいものを以下紹介します。

6-1.Java

Spring Framworkはプログラミング言語にJavaが使用されています。基本的な変数の扱いやループ文等基礎的な構文から複雑なアルゴリズムやロジックを記載するまで、プログラミングを読み書きして、状況に応じたカスタマイズを行えることが、最初に必要となるスキルでしょう。

6-2.Webサーバー・DBの知識

私達が普段使用しているWebアプリは単体で提供されておらずデータベースやWebサーバー等別のミドルウェアと連携してサービスが提供されていることがほとんどです。Webサーバーはウェブブラウザからのアクセスに対して、HTML等を提供します。またデータベースはやアプリに関わるリソースデータを保存したり高速で検索したりできるようにしてくれます。これらのミドルウェアとSpring MVCを連携させる設定や仕組みについてもある程度通ずることが必要になってきます。

6-3.バージョン管理ツール

Gitが有名ですがSubversionやMercurial等、ソースコードの変更履歴を記録してバージョンを管理するためのツールが開発では使用されます。もしこれらを使わないまま、複数のメンバーが無秩序にソースコードやファイルに対して変更を行っていくと、誰がいつ何の変更を行なったか、どのファイルが最新なのかといった混乱が即座に発生するでしょう。


バージョン管理ツールを使用することで、変更履歴をすべて記録できる・以前の状態に戻せる・デグレードの発生を防止するという近年では必要不可欠な恩恵を享受できます。開発現場では絶対と言っていいほど使用されていますので、最低限の使い方は学んでおくと良いでしょう。


この記事をシェア