自己紹介
株式会社Good Labでエンジニアをしている コータロー です。
日々、Java・SQL・Gitなどの技術情報や、新人エンジニア向けの学習ノウハウ、
AI活用についての情報を発信しています。
Good Labについて気になった方は、コーポレートサイトもぜひご覧ください。
▶コーポレートサイト
はじめに
Servlet/JSP入門シリーズ(全10回) を完了した方を対象に、次のステップとして Spring Boot を学ぶシリーズです。
「Servlet/JSPで学んだ知識は、Spring Bootでどう活きるのか?」
この問いに答えながら、Servlet/JSPとの対比を通じてSpring Bootを習得していきます。
なぜSpring Bootを学ぶべきか
Servlet/JSPはWebアプリケーションの仕組みを理解するには最適ですが、実務でServlet/JSPを直接書く機会はほとんどありません。現在のJava Webアプリケーション開発では、Spring Bootが圧倒的に主流です。
- 求人の大多数がSpring Boot経験を求めている
- 大規模案件ではSpring Framework / Spring Bootがほぼ標準
- Servlet/JSPの知識はSpring Bootの内部動作を理解する基盤になる
Servlet/JSPで学んだHTTP、リクエスト/レスポンス、MVC、フィルターなどの知識は、Spring Bootでもそのまま活きます。
第1回で学ぶこと
- Spring Framework / Spring Boot の概要
- Servlet/JSPとSpring Bootの対比(何が変わり、何が変わらないか)
- 開発環境の構築(Spring Initializr)
- はじめてのSpring Bootアプリケーション(Hello World)
- Servlet版とSpring Boot版のコード比較
1. Spring Frameworkとは
Spring Frameworkの全体像
Spring Framework は、Javaのエンタープライズ向けアプリケーションフレームワークです。2003年にRod Johnsonによって開発され、20年以上の歴史があります。
Spring Frameworkの主な機能は以下の通りです。
| 機能 | 概要 |
|---|---|
| DI(依存性の注入) | オブジェクトの生成・管理をフレームワークに任せる |
| AOP(アスペクト指向) | ログやトランザクションなどの横断的処理を分離する |
| Spring MVC | WebアプリケーションのMVCフレームワーク |
| Spring Data | データベースアクセスの簡略化 |
| Spring Security | 認証・認可の仕組み |
ただし、Spring Frameworkを単体で使うには大量のXML設定や依存関係の管理が必要で、環境構築だけで一苦労でした。
Spring Boot とは
Spring Boot は、Spring Frameworkをすぐに使える状態にしたものです。
Spring Framework = エンジン + 部品一式
Spring Boot = エンジン + 部品 + 組み立て済みの車(すぐ走れる)
Spring Bootがやってくれること:
- 自動設定(Auto Configuration): 依存関係から設定を自動推測
- 組み込みサーバー: Tomcatが内蔵されている(別途インストール不要)
-
スターター依存関係: 必要な依存関係をまとめて追加(例:
spring-boot-starter-web) - 本番対応機能: ヘルスチェック、メトリクスなど
Servlet/JSPでは、Tomcatを別途インストールし、web.xmlを書き、WARファイルをデプロイしていました。Spring Bootではコマンド1つで起動できます。
2. Servlet/JSPからの変化を整理する
Servlet/JSP入門シリーズで学んだ各技術が、Spring Bootではどう変わるのかを整理します。
| Servlet/JSP | Spring Boot | 変化のポイント |
|---|---|---|
web.xml |
application.properties / application.yml
|
XMLからプロパティファイルへ |
HttpServlet を継承 |
@Controller / @RestController
|
継承からアノテーションへ |
doGet() / doPost()
|
@GetMapping / @PostMapping
|
メソッド名が自由になる |
| JSP(EL式 + JSTL) | Thymeleaf | テンプレートエンジンの変更 |
| JDBC直接操作 | Spring Data JPA | SQLを書かずにDB操作 |
Filter / Listener
|
Spring Security / HandlerInterceptor
|
フレームワークが提供 |
| Tomcat手動インストール | 組み込みTomcat | サーバーが内蔵される |
| WARデプロイ | JARで実行(java -jar) |
デプロイが簡単に |
重要な点として、Spring Bootの内部ではServletの仕組みがそのまま動いています。@GetMappingで定義したメソッドは、最終的にServletのdoGet()と同じ処理に変換されます。Servlet/JSPで学んだ知識は無駄にならないのです。
3. 開発環境の構築
必要なもの
| ツール | バージョン | 用途 |
|---|---|---|
| JDK | 21以降 | Java実行環境 |
| Maven | 3.9以降(JDK付属でも可) | ビルドツール |
| IDE | IntelliJ IDEA または VS Code | 統合開発環境 |
手順① JDKの確認
ターミナル(コマンドプロンプト)でJDKのバージョンを確認します。
java -version
openjdk version "21.0.x" ...
のように表示されれば問題ありません。JDK 21未満の場合は、Oracle JDK または Eclipse Temurin からJDK 21をインストールしてください。
手順② Spring Initializr でプロジェクト生成
Spring Initializr(start.spring.io) にアクセスし、以下の設定でプロジェクトを生成します。
| 項目 | 設定値 |
|---|---|
| Project | Maven |
| Language | Java |
| Spring Boot | 3.5.x(最新安定版を選択) |
| Group | com.example |
| Artifact | hello-spring |
| Name | hello-spring |
| Packaging | Jar |
| Java | 21 |
Spring Initializrの画面に3.5.x系が表示されない場合は、その時点での最新安定版(GA)を選択してください。Spring Boot 3.x系であれば、本記事のコードはそのまま動作します。
Dependencies(依存関係) に以下を追加します。
| 依存関係 | 用途 |
|---|---|
| Spring Web | Webアプリケーション構築(組み込みTomcat含む) |
| Thymeleaf | テンプレートエンジン(今回は使わないが、次回以降で使用) |
| Spring Boot DevTools | 開発時の自動リロード |
設定が完了したら GENERATE ボタンをクリックし、ZIPファイルをダウンロードします。
手順③ プロジェクトのインポート
ダウンロードしたZIPを解凍し、IDEでインポートします。
IntelliJ IDEAの場合:
- File → Open → 解凍したフォルダを選択
- 「Maven project detected」と表示されたら Load をクリック
VS Codeの場合:
- 拡張機能「Extension Pack for Java」をインストール
- File → Open Folder → 解凍したフォルダを選択
手順④ プロジェクト構造の確認
生成されたプロジェクトの構造は以下の通りです。
hello-spring/
├── src/
│ ├── main/
│ │ ├── java/com/example/hellospring/
│ │ │ └── HelloSpringApplication.java ← メインクラス
│ │ └── resources/
│ │ ├── static/ ← 静的ファイル(CSS, JS, 画像)
│ │ ├── templates/ ← Thymeleafテンプレート
│ │ └── application.properties ← 設定ファイル
│ └── test/
│ └── java/com/example/hellospring/
│ └── HelloSpringApplicationTests.java
├── pom.xml ← Mavenビルド設定
└── mvnw / mvnw.cmd ← Maven Wrapper
Servlet/JSPプロジェクトとの構造の違いを比較してみましょう。
| Servlet/JSP | Spring Boot | 説明 |
|---|---|---|
src/main/webapp/WEB-INF/web.xml |
src/main/resources/application.properties |
設定ファイルの場所が変わる |
src/main/webapp/ |
src/main/resources/static/ |
静的ファイルの配置場所 |
JSPファイル(webapp/配下) |
src/main/resources/templates/ |
テンプレートの配置場所 |
| なし | HelloSpringApplication.java |
Spring Boot専用のメインクラス |
4. pom.xml の解説
Spring Initializrで生成された pom.xml を確認しましょう。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- Spring Boot の親POM(バージョン管理を一元化) -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.5.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>hello-spring</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>hello-spring</name>
<description>Spring Boot入門プロジェクト</description>
<properties>
<java.version>21</java.version>
</properties>
<dependencies>
<!-- Web(組み込みTomcat + Spring MVC) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- テンプレートエンジン -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!-- 開発時の自動リロード -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<!-- テスト -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
ポイント解説
spring-boot-starter-parent
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.5.1</version>
</parent>
Spring Bootの親POMです。これにより、各ライブラリのバージョンが自動管理されます。個別の依存関係に <version> を書く必要がありません。
spring-boot-starter-web
この1行だけで、以下がすべて含まれます。
- Spring MVC
- 組み込みTomcat
- Jackson(JSON変換)
Servlet/JSPでは、Servlet API、JSP API、JSTLなどを個別に追加する必要がありました。Spring Bootでは「スターター」がまとめて管理してくれます。
5. はじめてのSpring Bootアプリケーション
メインクラスの確認
src/main/java/com/example/hellospring/HelloSpringApplication.java を開きます。
package com.example.hellospring;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class HelloSpringApplication {
public static void main(String[] args) {
SpringApplication.run(HelloSpringApplication.class, args);
}
}
@SpringBootApplication アノテーション1つで、以下の3つが有効になります。
| アノテーション | 役割 |
|---|---|
@SpringBootConfiguration |
このクラスがSpring Bootの設定クラスであることを示す |
@EnableAutoConfiguration |
クラスパスの内容に基づいて設定を自動推測する |
@ComponentScan |
このパッケージ以下のコンポーネントを自動検出する |
HelloController の作成
src/main/java/com/example/hellospring/ に HelloController.java を新規作成します。
package com.example.hellospring;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "Hello, Spring Boot!";
}
}
たったこれだけです。コードを1行ずつ見ていきましょう。
@RestController
@RestController
public class HelloController {
このクラスがWebリクエストを処理するコントローラーであることを示します。@RestController はメソッドの戻り値をそのままHTTPレスポンスのボディとして返します。
Servlet/JSPで言えば、HttpServlet を継承して PrintWriter で出力する処理に相当しますが、HttpServlet の継承も PrintWriter の取得も不要です。
@GetMapping("/hello")
@GetMapping("/hello")
public String hello() {
HTTP GETリクエストで /hello にアクセスしたとき、このメソッドが呼ばれます。
Servlet/JSPでは @WebServlet("/hello") と doGet() メソッドの2か所で定義していた内容が、@GetMapping 1つに集約されています。
アプリケーションの起動
プロジェクトのルートディレクトリで以下のコマンドを実行します。
./mvnw spring-boot:run
Windows の場合:
mvnw.cmd spring-boot:run
起動に成功すると、コンソールに以下のようなログが表示されます。
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v3.5.1)
...
Tomcat started on port 8080 (http) with context path '/'
Started HelloSpringApplication in 1.5 seconds (process running for 1.8)
ブラウザで http://localhost:8080/hello にアクセスすると、以下が表示されます。
Hello, Spring Boot!
注目すべき点:
- Tomcatを別途インストールしていない(Spring Bootに内蔵されている)
-
web.xmlを書いていない - WARファイルをデプロイしていない
- コマンド1つで起動できた
6. Servlet版 vs Spring Boot版 ― コード比較
同じ「Hello World」をServlet版とSpring Boot版で比較します。
Servlet版(従来の方法)
web.xml(URLマッピングの設定):
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
version="6.0">
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
HelloServlet.java:
package servlet;
import java.io.IOException;
import java.io.PrintWriter;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/plain; charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("Hello, Servlet!");
}
}
ファイル数: 2、合計: 約30行
Spring Boot版
HelloController.java:
package com.example.hellospring;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "Hello, Spring Boot!";
}
}
ファイル数: 1、合計: 約12行(メインクラスは自動生成済み)
何が不要になったか
| Servlet版で必要だったもの | Spring Boot版 |
|---|---|
web.xml(URLマッピング設定) |
不要(@GetMapping で完結) |
HttpServlet の継承 |
不要(@RestController で宣言) |
doGet() メソッドのオーバーライド |
不要(任意のメソッド名でOK) |
HttpServletRequest / HttpServletResponse の引数 |
不要(必要なときだけ宣言) |
PrintWriter の取得と出力 |
不要(return するだけ) |
setContentType() の設定 |
不要(自動設定される) |
| Tomcatの個別インストール | 不要(組み込みTomcat) |
Spring Bootが定型的な処理を自動化してくれることで、開発者はビジネスロジックに集中できます。
7. もう少し試してみる ― パスパラメータとクエリパラメータ
コントローラーの基本が分かったところで、少しだけ発展的な例を見ておきましょう。
パスパラメータを受け取る
package com.example.hellospring;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class GreetingController {
@GetMapping("/greet/{name}")
public String greet(@PathVariable String name) {
return "こんにちは、" + name + "さん!";
}
}
http://localhost:8080/greet/田中 にアクセスすると:
こんにちは、田中さん!
Servlet版では request.getPathInfo() や request.getRequestURI() からパスを自分で解析する必要がありました。Spring Bootでは @PathVariable を付けるだけで自動的に変数にバインドされます。
クエリパラメータを受け取る
package com.example.hellospring;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class SearchController {
@GetMapping("/search")
public String search(@RequestParam String keyword,
@RequestParam(defaultValue = "1") int page) {
return "検索キーワード: " + keyword + "(" + page + "ページ目)";
}
}
http://localhost:8080/search?keyword=Java&page=3 にアクセスすると:
検索キーワード: Java(3ページ目)
Servlet版では request.getParameter("keyword") で取得し、型変換も自分で行っていました。Spring Bootでは @RequestParam でパラメータ名と型を宣言するだけで、型変換まで自動で行われます。
練習問題
問題1:自己紹介API ⭐
以下の仕様で自己紹介を返すコントローラーを作成してください。
- エンドポイント:
GET /profile - 戻り値:
名前: 田中太郎 / 趣味: プログラミング / 好きな言語: Java
模範解答
package com.example.hellospring;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ProfileController {
@GetMapping("/profile")
public String profile() {
return "名前: 田中太郎 / 趣味: プログラミング / 好きな言語: Java";
}
}
問題2:計算API ⭐⭐
2つの数値を受け取り、四則演算の結果を返すコントローラーを作成してください。
- エンドポイント:
GET /calc?a=10&b=3 - 戻り値例:
10 + 3 = 13, 10 - 3 = 7, 10 * 3 = 30, 10 / 3 = 3
模範解答
package com.example.hellospring;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class CalcController {
@GetMapping("/calc")
public String calc(@RequestParam int a, @RequestParam int b) {
int sum = a + b;
int diff = a - b;
int prod = a * b;
int quot = a / b;
return a + " + " + b + " = " + sum + ", "
+ a + " - " + b + " = " + diff + ", "
+ a + " * " + b + " = " + prod + ", "
+ a + " / " + b + " = " + quot;
}
}
http://localhost:8080/calc?a=10&b=3 にアクセスすると以下が表示されます。
10 + 3 = 13, 10 - 3 = 7, 10 * 3 = 30, 10 / 3 = 3
注意:b=0 の場合は ArithmeticException が発生します。例外処理については今後のシリーズで扱います。
問題3:挨拶API ⭐⭐
パスパラメータで名前を、クエリパラメータで時間帯を受け取り、適切な挨拶を返すコントローラーを作成してください。
- エンドポイント:
GET /greeting/{name}?period=morning -
periodの値に応じて挨拶を変える-
morning→おはようございます -
afternoon→こんにちは -
evening→こんばんは - 上記以外 →
こんにちは(デフォルト)
-
模範解答
package com.example.hellospring;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class GreetingPeriodController {
@GetMapping("/greeting/{name}")
public String greet(@PathVariable String name,
@RequestParam(defaultValue = "afternoon") String period) {
String greeting = switch (period) {
case "morning" -> "おはようございます";
case "afternoon" -> "こんにちは";
case "evening" -> "こんばんは";
default -> "こんにちは";
};
return greeting + "、" + name + "さん!";
}
}
http://localhost:8080/greeting/田中?period=morning にアクセスすると以下が表示されます。
おはようございます、田中さん!
period を省略した場合はデフォルト値 afternoon が使われます。
こんにちは、田中さん!
まとめ
| 学んだこと | キーワード |
|---|---|
| Spring Frameworkの概要 | DI、AOP、Spring MVC |
| Spring Bootの役割 | 自動設定、組み込みTomcat、スターター |
| Servlet/JSPとの対比 | アノテーション駆動、設定の簡略化 |
| 環境構築 | Spring Initializr、pom.xml、Maven Wrapper |
| コントローラーの基本 |
@RestController、@GetMapping、@PathVariable、@RequestParam
|
Servlet/JSPの知識はどう活きたか
| Servlet/JSPの知識 | Spring Bootでの活用 |
|---|---|
| HTTPリクエスト/レスポンスの理解 |
@GetMapping / @PostMapping の意味がすぐ分かる |
doGet() / doPost()
|
HTTPメソッドに応じた処理の振り分けが理解できる |
request.getParameter() |
@RequestParam が何をしているか内部的に理解できる |
web.xml のURLマッピング |
アノテーションによるルーティングの仕組みが分かる |
| MVCパターン | Spring MVCのController-Service-Repository構成の基盤 |
次回は コントローラとルーティング を詳しく学びます。@Controller と @RestController の違い、リクエストボディの受け取り方、レスポンスのカスタマイズなどを扱います。
Spring Boot入門シリーズ 全10回(予定):
- 👉 Servlet/JSPからの移行と環境構築(本記事)
- コントローラとルーティング
- Thymeleafによるビュー
- フォーム処理とバリデーション
- Spring Data JPA(データベース連携)
- RESTful API設計
- Spring Security(認証・認可)
- 例外処理とエラーハンドリング
- テストの書き方(JUnit + MockMvc)
- 総合演習:掲示板アプリをSpring Bootで再構築
参考
@kotaro_ai_lab
AI活用や開発効率化について発信しています。フォローお気軽にどうぞ!