1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

自己紹介

株式会社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の場合:

  1. FileOpen → 解凍したフォルダを選択
  2. 「Maven project detected」と表示されたら Load をクリック

VS Codeの場合:

  1. 拡張機能「Extension Pack for Java」をインストール
  2. FileOpen 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回(予定):

  1. 👉 Servlet/JSPからの移行と環境構築(本記事)
  2. コントローラとルーティング
  3. Thymeleafによるビュー
  4. フォーム処理とバリデーション
  5. Spring Data JPA(データベース連携)
  6. RESTful API設計
  7. Spring Security(認証・認可)
  8. 例外処理とエラーハンドリング
  9. テストの書き方(JUnit + MockMvc)
  10. 総合演習:掲示板アプリをSpring Bootで再構築

参考


@kotaro_ai_lab
AI活用や開発効率化について発信しています。フォローお気軽にどうぞ!

1
2
0

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
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?