Spring MVCのコントローラとは?初心者でもわかるJava Web開発の基本
新人
「Spring MVCの勉強をしていたらコントローラという言葉がたくさん出てきました。これは何をするものなんですか」
先輩
「コントローラはユーザーのリクエストを受け取って処理を行い結果を画面に返す役割を持つJavaクラスです。Webアプリケーションの中心的な役割を持っています」
新人
「リクエストというのはブラウザでページを開いたりボタンを押したりすることですか」
先輩
「その通りです。ブラウザから送られたリクエストを受け取り必要な処理を行うのがSpring MVCのコントローラです。まずはMVCアーキテクチャという考え方から理解すると分かりやすいですよ」
1. Spring MVCのコントローラとは?MVCアーキテクチャの基本を理解する
Spring MVCはJavaでWebアプリケーションを開発するときによく使われるフレームワークです。フレームワークとは開発を効率良く進めるためにあらかじめ用意された仕組みのことを指します。Spring Frameworkの中でも特にWebアプリケーション開発を担当するのがSpring MVCです。
Spring MVCを理解するためにはまずMVCアーキテクチャという設計の考え方を知る必要があります。MVCとは三つの役割に分けてプログラムを整理する設計方法です。プログラムの役割を分けることで保守しやすく読みやすいコードを書くことができます。
MVCは次の三つの言葉の頭文字から作られています。Model View Controllerです。Modelはデータやビジネスロジックを管理する部分です。例えば会員情報や商品情報などアプリケーションのデータを扱います。Viewは画面表示を担当します。HTMLやJSPなどでユーザーに見える画面を作ります。そしてControllerがユーザーからのリクエストを受け取り処理の流れを制御します。
例えばネットショップを想像してみてください。ユーザーが商品一覧ページを開くとブラウザからリクエストが送られます。このリクエストを最初に受け取るのがコントローラです。コントローラは商品情報を取得するためにModelに処理を依頼します。Modelから商品データを受け取ったらそれをViewに渡します。Viewはそのデータを使って商品一覧の画面を作りユーザーのブラウザに表示します。
このようにコントローラはユーザーの操作とプログラムの処理をつなぐ役割を持っています。Spring MVCではJavaクラスに特定のアノテーションを付けることでコントローラとして動作させることができます。
次は実際にSpring MVCでコントローラを書く基本的なコード例を見てみましょう。
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HomeController {
@GetMapping("/home")
public String showHome(Model model) {
model.addAttribute("message", "Spring MVCへようこそ");
return "home";
}
}
このコードではControllerというアノテーションを付けたJavaクラスを作成しています。アノテーションとはプログラムに特別な意味を持たせるための目印のようなものです。このアノテーションを付けることでSpringはこのクラスをコントローラとして認識します。
GetMappingはブラウザから特定のURLにアクセスされたときに実行するメソッドを指定するためのものです。この例ではhomeというURLにアクセスするとshowHomeメソッドが実行されます。ModelというオブジェクトはViewにデータを渡すための箱のような役割を持っています。
2. MVCコントローラとREST APIコントローラの違いを初心者向けに解説
Spring MVCのコントローラには大きく分けて二つの種類があります。一つは画面表示を行うMVCコントローラです。もう一つはデータだけを返すREST APIコントローラです。最近のWebアプリケーションではスマートフォンアプリやJavaScriptと連携するためREST APIがよく使われています。
MVCコントローラは主に画面を表示するためのコントローラです。JSPやThymeleafなどのテンプレートエンジンを使ってHTML画面を作成しユーザーに表示します。例えばログイン画面や商品一覧画面などブラウザで表示されるページはこのタイプのコントローラで処理されることが多いです。
一方REST APIコントローラは画面ではなくデータを返すコントローラです。多くの場合JSON形式のデータを返します。JSONとはデータをやり取りするためのテキスト形式でWebサービスやスマートフォンアプリでよく使われています。
例えばスマートフォンアプリがサーバーからユーザー情報を取得する場合を考えてみましょう。アプリはサーバーにリクエストを送りサーバーはユーザー情報をJSON形式で返します。このとき活躍するのがREST APIコントローラです。
次のコードはSpringで簡単なREST APIを作る例です。
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserApiController {
@GetMapping("/api/user")
public User getUser() {
User user = new User();
user.setName("Taro");
user.setAge(25);
return user;
}
}
このコードではブラウザやアプリからapi userというURLにアクセスするとユーザー情報を返します。戻り値としてJavaオブジェクトを返すとSpringが自動的にJSON形式へ変換してくれます。これがREST APIコントローラの大きな特徴です。
3. Spring MVCで使われるControllerとRestControllerの役割
Spring MVCではコントローラを作るために主に二つのアノテーションが使われます。それがControllerとRestControllerです。どちらもリクエストを処理するクラスですが役割が少し違います。
Controllerは主に画面表示を行うMVCコントローラで使われます。このアノテーションを付けたメソッドは通常文字列を返します。この文字列は表示する画面の名前を表しています。Springはその名前を元に対応するViewファイルを探して画面を表示します。
例えば次のようなJSPファイルがあるとします。
<%@ page contentType="text/html;charset=UTF-8" %>
<html>
<head>
<title>ホーム画面</title>
</head>
<body>
<h1>${message}</h1>
</body>
</html>
コントローラからhomeという名前を返すとこのようなViewファイルが表示されます。これが典型的なSpring MVCの画面表示の流れです。
一方RestControllerはREST API専用のコントローラです。このアノテーションを使うとメソッドの戻り値がそのままレスポンスデータとして返されます。画面を表示するのではなくJSONやテキストなどのデータを返す用途に向いています。
実はRestControllerはControllerとResponseBodyというアノテーションを組み合わせたものです。つまりControllerでありながら戻り値をそのままデータとして返す機能を持っています。REST APIを作るときはこのアノテーションを使うとシンプルにコードを書くことができます。
Spring MVCのコントローラはJava Web開発の中でも非常に重要な役割を持っています。ユーザーのリクエストを受け取り処理を振り分ける中心的な存在です。MVCの考え方を理解しControllerとRestControllerの違いを知ることでSpring BootやSpring Frameworkを使ったWebアプリケーション開発がぐっと理解しやすくなります。
4. MVCコントローラの仕組みと画面表示Viewまでの処理の流れ
新人
「Spring MVCのコントローラがリクエストを受け取るということは分かりましたが、そのあと画面が表示されるまでの流れがまだよく分かりません」
先輩
「それは良い疑問ですね。Spring MVCではブラウザからリクエストが送られてから画面が表示されるまでにいくつかの処理が順番に行われます。その流れを理解するとWebアプリケーションの仕組みがかなり見えてきます」
Spring MVCのWebアプリケーションではブラウザから送られたリクエストはまずDispatcherServletという特別なサーブレットに届きます。これはSpring MVCの中心的な仕組みでありリクエストの受付窓口のような役割を持っています。
DispatcherServletはリクエストされたURLを確認しどのコントローラのメソッドを実行するかを判断します。例えば商品一覧ページを表示するURLにアクセスされた場合そのURLに対応したコントローラメソッドが呼び出されます。
コントローラのメソッドが実行されると必要に応じてサービスクラスやリポジトリクラスに処理を依頼します。ここではデータベースから情報を取得したりビジネスロジックを実行したりします。処理が終わるとコントローラは画面に表示するためのデータをModelオブジェクトに格納します。
Modelに格納されたデータはViewに渡されます。Viewはテンプレートエンジンを使ってHTMLを生成します。例えばThymeleafやJSPなどが代表的なテンプレートエンジンです。ViewはModelのデータを埋め込みながら最終的なHTMLを作成しブラウザへ返します。
このようにSpring MVCではリクエストの受付コントローラの実行データ取得画面生成という流れで処理が進みます。役割ごとに処理が分かれているためコードの管理がしやすく大規模なWebアプリケーションでも整理された構造を保つことができます。
次のコードは画面表示を行うMVCコントローラのもう一つの例です。ユーザー一覧ページを表示する処理を想定しています。
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import java.util.ArrayList;
import java.util.List;
@Controller
public class UserController {
@GetMapping("/users")
public String showUserList(Model model) {
List<String> users = new ArrayList<>();
users.add("Taro");
users.add("Hanako");
users.add("Jiro");
model.addAttribute("userList", users);
return "user-list";
}
}
このコードではusersというURLにアクセスするとshowUserListメソッドが実行されます。メソッドの中ではユーザー名のリストを作成しModelに追加しています。userListという名前でViewにデータを渡しているためテンプレート側ではこの名前を使って一覧表示を作ることができます。
つまりMVCコントローラの役割は画面表示のためのデータを準備しどのViewを表示するかを決定することです。画面のHTMLそのものはViewが担当するためコントローラのコードはシンプルに保たれます。
5. REST APIコントローラの仕組みとJSONレスポンスの返し方
新人
「REST APIコントローラはJSONを返すと説明がありましたがその仕組みはどのようになっているのですか」
先輩
「SpringではJavaオブジェクトを返すだけで自動的にJSONへ変換してくれる便利な機能があります。この機能を使うことで複雑な処理を書かなくてもREST APIを作ることができます」
REST APIコントローラでは主にRestControllerというアノテーションを使います。このアノテーションを付けるとメソッドの戻り値がそのままレスポンスデータとして返されます。HTML画面を表示するのではなくデータを直接返す点がMVCコントローラとの大きな違いです。
Spring BootやSpring MVCにはメッセージコンバータという仕組みがあります。これはJavaオブジェクトをJSONやXMLなどの形式に変換する機能です。REST APIコントローラでオブジェクトを返すとこの仕組みが自動的にJSONへ変換してくれます。
例えばユーザー情報を返すAPIを作る場合コントローラのメソッドでUserオブジェクトを返すだけでJSONデータが作られます。これによりスマートフォンアプリやJavaScriptのフロントエンドから簡単にデータを取得できるようになります。
次のコードは複数のユーザー情報をJSON形式で返すREST APIの例です。
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
@RestController
public class UserApiController {
@GetMapping("/api/users")
public List<User> getUsers() {
List<User> users = new ArrayList<>();
users.add(new User("Taro", 25));
users.add(new User("Hanako", 22));
users.add(new User("Jiro", 30));
return users;
}
}
このメソッドはユーザーのリストを戻り値として返しています。REST APIコントローラではこのリストが自動的にJSON配列へ変換されます。つまりJavaのデータ構造をそのままWeb APIとして公開できるという便利な仕組みになっています。
REST APIは現在のWeb開発では非常に重要な技術です。フロントエンドとバックエンドを分離する開発方法が増えているためSpring MVCでREST APIコントローラを作る技術は多くの開発現場で使われています。
6. Spring MVCにおけるMVCコントローラとRESTコントローラの実装例
ここまで説明してきたようにSpring MVCでは画面を表示するMVCコントローラとデータを返すREST APIコントローラの二つを使い分けます。実際のWebアプリケーションではこの二つのコントローラが組み合わさって動作することが多いです。
例えば管理画面のようなシステムではブラウザで表示するページはMVCコントローラで作られます。一方でJavaScriptを使った非同期通信やスマートフォンアプリとの連携ではREST APIコントローラが利用されます。
このように役割を分けて実装することでアプリケーションの構造が整理され開発や保守がしやすくなります。Spring MVCはこのような設計を簡単に実現できるように多くの便利なアノテーションや仕組みを提供しています。
次はMVCコントローラとREST APIコントローラを同じプロジェクトで使うシンプルな例を見てみましょう。
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class PageController {
@GetMapping("/dashboard")
public String showDashboard() {
return "dashboard";
}
}
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DashboardApiController {
@GetMapping("/api/dashboard/message")
public String getMessage() {
return "Dashboard Data Loaded";
}
}
この例ではdashboardというURLにアクセスすると画面を表示するMVCコントローラが実行されます。そしてJavaScriptなどからapi dashboard messageというURLにアクセスするとREST APIコントローラがデータを返します。
このような構成は現代のWebアプリケーションでよく使われています。画面表示とデータ提供の役割を分けることで柔軟なアプリケーション設計が可能になります。Spring MVCを使ったJava Web開発ではこの二つのコントローラを理解することがとても重要です。
特にSpring Bootを使った開発ではこれらのコントローラを簡単に作成できるため初心者でも比較的短いコードでWebアプリケーションを構築できます。MVCの考え方とREST APIの仕組みを理解しておくことでより実践的なWebシステム開発に対応できるようになります。
7. MVCコントローラとREST APIコントローラの使い分け方
新人
「MVCコントローラとREST APIコントローラの違いは分かってきましたが実際の開発ではどのように使い分けるのですか」
先輩
「良い質問ですね。基本的には画面を表示する処理はMVCコントローラを使いデータだけを返す処理はREST APIコントローラを使います。役割を明確に分けることが大切です」
Webアプリケーション開発ではユーザーに画面を表示する処理とシステム同士でデータをやり取りする処理の二種類が存在します。Spring MVCではこれらの役割をそれぞれMVCコントローラとREST APIコントローラで分けて実装することが一般的です。
例えば社内管理システムを考えてみましょう。ユーザーがブラウザでログインしてダッシュボード画面を開く場合その画面を表示する処理はMVCコントローラで実装されます。一方で画面内のグラフや一覧データを非同期通信で取得する場合そのデータを返す処理はREST APIコントローラで実装されることが多いです。
最近のWeb開発ではJavaScriptを使ったフロントエンド開発が増えているためREST APIの役割はますます重要になっています。フロントエンドのプログラムがサーバーへリクエストを送りサーバーがJSON形式でデータを返すという構成が多くのシステムで採用されています。
次のコードは画面を表示するMVCコントローラとデータを取得するREST APIコントローラを組み合わせた例です。実際のシステムでもこのような形で役割を分けて実装することがよくあります。
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class ProductPageController {
@GetMapping("/products")
public String showProductPage() {
return "product-list";
}
}
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Arrays;
import java.util.List;
@RestController
public class ProductApiController {
@GetMapping("/api/products")
public List<String> getProducts() {
return Arrays.asList("Laptop", "Tablet", "Smartphone");
}
}
この例ではproductsというURLにアクセスすると商品一覧ページが表示されます。そしてJavaScriptなどからapi productsというURLにアクセスすると商品データがJSON形式で返されます。このように画面表示とデータ取得の役割を分けることでコードの責任範囲が明確になります。
システムの規模が大きくなるほどこのような役割分担は重要になります。画面表示のロジックとデータ提供のロジックを分離することでコードの再利用性が高まり保守や機能追加がしやすくなるためです。
8. REST APIコントローラを使う際の注意点と設計のポイント
REST APIコントローラは非常に便利な仕組みですが設計を適切に行わないと管理が難しいシステムになってしまうことがあります。特に大規模なWebアプリケーションではAPI設計のルールを決めておくことが重要です。
まず意識したいのがURL設計です。REST APIではリソースという考え方を中心にURLを設計します。リソースとはシステムが扱うデータの単位のことです。例えばユーザー情報や商品情報注文情報などがリソースになります。
一般的には複数のデータを扱う場合は複数形のURLを使うことが多いです。例えばユーザー一覧を取得する場合はapi usersというURLを使います。特定のユーザーを取得する場合はapi users idのように識別子を付けてアクセスします。このような設計にすることでAPIの意味が分かりやすくなります。
次に重要なのがHTTPメソッドの使い分けです。REST APIでは処理の種類に応じてHTTPメソッドを使い分けます。データ取得にはGETを使いデータ登録にはPOST更新にはPUT削除にはDELETEを使うというルールがよく使われます。
Spring MVCではこれらのHTTPメソッドに対応するアノテーションが用意されています。例えばPostMappingやDeleteMappingなどを使うことで分かりやすいAPIを作ることができます。
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
@RestController
@RequestMapping("/api/users")
public class UserRestApiController {
private List<String> users = new ArrayList<>();
@PostMapping
public String createUser(@RequestParam String name) {
users.add(name);
return "User Created";
}
@GetMapping
public List<String> getUsers() {
return users;
}
@DeleteMapping("/{name}")
public String deleteUser(@PathVariable String name) {
users.remove(name);
return "User Deleted";
}
}
このコードではユーザーの登録取得削除をそれぞれ異なるHTTPメソッドで実装しています。このように役割を整理することでAPIの構造が理解しやすくなります。
またREST APIを設計する際にはエラーハンドリングも重要です。例えば存在しないデータを取得しようとした場合には適切なエラーレスポンスを返す必要があります。Springでは例外処理の仕組みを使うことでエラー内容を分かりやすくクライアントへ返すことができます。
このような設計ポイントを意識することでREST APIはより使いやすく保守しやすいものになります。単にデータを返すだけではなく長期的に運用しやすい構造を考えることが大切です。
9. Spring MVCコントローラとREST APIコントローラの違いまとめ
新人
「ここまで説明を聞いてだいぶ理解できましたが最後にもう一度違いを整理してもらえますか」
先輩
「もちろんです。二つのコントローラは役割がはっきり分かれているのでその違いを整理して覚えておくと開発で迷わなくなります」
Spring MVCのMVCコントローラは主に画面表示を担当するコントローラです。ブラウザから送られたリクエストを受け取り必要なデータをModelに格納しどのViewを表示するかを決定します。最終的にはHTML画面が生成されユーザーのブラウザに表示されます。
一方REST APIコントローラは画面を表示するのではなくデータを返すことを目的としたコントローラです。戻り値としてJavaオブジェクトやリストを返すとSpringのメッセージコンバータによってJSON形式に変換されクライアントへ送信されます。
つまりMVCコントローラは画面表示のためのコントローラREST APIコントローラはデータ提供のためのコントローラという役割の違いがあります。この違いを理解することでWebアプリケーションの構造をより明確に設計できるようになります。
実際の開発では両方のコントローラを組み合わせて使うことが一般的です。画面表示はMVCコントローラが担当し画面からの非同期通信や外部システム連携にはREST APIコントローラを利用します。このような構成にすることで柔軟で拡張性の高いWebアプリケーションを構築できます。
Spring FrameworkやSpring Bootを使った開発ではコントローラの理解が非常に重要です。MVCの考え方とREST APIの仕組みをしっかり理解しておくことでJava Web開発の基礎が身に付きより実践的なシステム開発に対応できるようになります。