Spring Bootの概要と開発環境の構築
Spring BootはエンタープライズレベルのJava開発をブロック組み立てのように簡単にします。自動設定, スターター依存関係, 組み込みコンテナという3つの主要機能により, 煩雑なXML設定の必要が完全になくなります。
1. 学ぶ内容
- Spring Bootを従来のSpringと差別化する3つの主要機能
- Java 17 LTSの新機能の概要 (record, sealed class, text block)
- Spring Initializrを使ってプロジェクト構造を生成する
- IDEA / VS Code開発環境のセットアップとプラグインの推奨
- AliceのOrderFlowプロジェクトの背景とコースロードマップ
2. バックエンド開発者の実話
(1) ペインポイント:XML設定地獄
Aliceは従来のSpring MVCプロジェクトであるOrderFlow電子商取引注文管理システムを引き継いだばかりのバックエンド開発者です。プロジェクトには20以上のXML設定ファイルが含まれており, データソース設定だけでも5つのファイルにまたがっています。新しい機能を追加するたびに3つのXMLファイルを行き来しなければならず, 新しいチームメンバーが仕事に慣れるまで平均2週間かかります。デプロイにはTomcatを別途インストールしJNDIデータソースを設定する必要があり, 環境の問題1つを解決するのに半日かかることもあります。
(2) Spring Bootによる解決策
Spring Bootは「設定より規約」という哲学を用い, 煩雑なXML設定をゼロ設定起動に置き換えます。
@SpringBootApplication
public class OrderFlowApplication {
public static void main(String[] args) {
SpringApplication.run(OrderFlowApplication.class, args);
}
}
(3) 成果
AliceがSpring Bootを使ってOrderFlowをリファクタリングした後, XML設定ファイルの数は20から0に減り, 新入社員のオンボーディング時間は2週間から2日に短縮され, デプロイはjava -jarコマンド1つで済み, 組み込みTomcatがすぐに使えるようになりました。
3. Spring Bootの核心機能
(1) 3つの核心機能
Spring Bootの核心概念は3つのキーワードに要約されます。自動設定, スターター依存関係, 組み込みコンテナです。
graph LR
A[Spring Boot] --> B[自動設定<br/>Auto Configuration]
A --> C[スターター依存関係<br/>Starter Dependencies]
A --> D[組み込みサーバー<br/>Embedded Server]
B --> B1[条件に基づく<br/>Bean登録]
C --> C1[固定的な<br/>依存関係管理]
D --> D1[Tomcat / Jetty<br/>/ Undertow]
| 機能 | 従来のSpring | Spring Boot |
|---|---|---|
| 設定方法 | 大量のXML / Java Config | 自動設定 + 最小限のYAML |
| 依存関係管理 | バージョンの手動指定で競合が発生する可能性 | スターター依存関係で統一バージョン管理 |
| アプリケーションサーバー | 外部インストールのTomcat | 組み込みTomcat, JARから直接実行 |
| プロジェクト構造 | コンポーネントスキャンの手動設定が必要 | @SpringBootApplication一括有効化 |
| 起動方法 | WARをコンテナにデプロイ | java -jarまたはmvn spring-boot:run |
(2) Spring Boot 3.xの新たな要件
Spring Boot 3.xはメジャーリリースであり, 最低でもJava 17とJakarta EE 9+が必要です。
| 項目 | Spring Boot 2.x | Spring Boot 3.x |
|---|---|---|
| 最低Javaバージョン | Java 8 | Java 17 |
| 名前空間 | javax.* |
jakarta.* |
| Spring Framework | 5.x | 6.x |
| GraalVM Native Image | 実験的 | 公式サポート |
| オブザーバビリティ | Micrometer基本機能 | MicrometerとOTelの深い統合 |
javax → jakartaパッケージ名移行は最も重要な破壊的変更であり, すべてのimport文を更新する必要があります。
4. Java 17 LTSの新機能の概要
(1) Recordクラス
Recordは不変データ型で, コンストラクタ, getter, equals, hashCode, toStringを自動生成します。
(1) ▶ サンプル:Recordを使った注文DTOの定義
public record OrderRequest(
Long productId,
Integer quantity,
String customerEmail
) {}
出力:
// 実行成功
(2) Sealed Class
sealed classは継承または実装を許可するクラスを制限し, 型安全性を強化します。
(2) ▶ サンプル:Sealed Classを使った支払いステータスの定義
public sealed interface PaymentStatus
permits Pending, Completed, Failed {}
public record Pending(String transactionId) implements PaymentStatus {}
public record Completed(String transactionId, LocalDateTime paidAt) implements PaymentStatus {}
public record Failed(String transactionId, String reason) implements PaymentStatus {}
出力:
// 実行成功
(3) Text Block
Text Block:三重引用符を使って複数行文字列を記述し, エスケープ文字とお別れします。
(3) ▶ サンプル:Text Blockを使ったSQLクエリの記述
String query = """
SELECT o.id, o.total_amount, c.email
FROM orders o
JOIN customers c ON o.customer_id = c.id
WHERE o.status = 'PENDING'
AND o.created_at < :cutoffTime
ORDER BY o.created_at DESC
""";
出力:
// 実行成功
| 機能 | Java 11構文 | Java 17構文 |
|---|---|---|
| 不変データ | 手書きのLombokまたはボイラープレート | record1行で完了 |
| 型階層の制御 | 継承の制限なし | sealedでサブクラスを制限 |
| 複数行文字列 | 連結 + \n |
""" ... """ |
| Switch式 | 文 | 式 + パターンマッチングプレビュー |
5. Spring Initializrを使ったプロジェクト作成
(1) Spring Initializrの紹介
Spring Initializrは公式プロジェクトジェネレータで, WebインターフェースまたはIDE統合によりプロジェクトスケルトンを迅速に作成できます。
(1) ▶ サンプル:curlでSpring Initializrを使用
curl https://start.spring.io/starter.zip \
-d type=maven-project \
-d language=java \
-d bootVersion=3.2.5 \
-d groupId=com.orderflow \
-d artifactId=orderflow-service \
-d name=orderflow-service \
-d packageName=com.orderflow \
-d javaVersion=17 \
-d dependencies=web,data-jpa,mysql,validation \
-o orderflow-service.zip
出力:
{"status":"ok","data":{}}
(2) 生成されるプロジェクト構造
orderflow-service/
├── src/
│ ├── main/
│ │ ├── java/com/orderflow/
│ │ │ └── OrderflowServiceApplication.java
│ │ └── resources/
│ │ ├── application.properties
│ │ ├── static/
│ │ └── templates/
│ └── test/
│ └── java/com/orderflow/
│ └── OrderflowServiceApplicationTests.java
├── pom.xml
└── mvnw / mvnw.cmd
(2) ▶ サンプル:OrderFlowのpom.xmlの主要な依存関係
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.5</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
出力:
// 実行成功
6. 開発環境の設定
(1) IDEの選択とプラグイン
| IDE | 推奨プラグイン | 利点 |
|---|---|---|
| IntelliJ IDEA Ultimate | Spring Boot Plugin / Spring Initializr | 最高のSpringサポート, ワンクリック実行 |
| IntelliJ IDEA Community | Spring Boot Assistant (サードパーティ) | 無料だが機能が限定 |
| VS Code | Spring Boot Extension Pack | 軽量, フロントエンドからバックエンドへの移行に最適 |
(2) 必須ツール一覧
| ツール | 用途 | インストール確認 |
|---|---|---|
| JDK 17+ | コンパイルと実行 | java -version |
| Maven 3.9+ | ビルドツール | mvn -version |
| Git | バージョン管理 | git --version |
| Postman / curl | APIテスト | テストリクエストの送信 |
(1) ▶ サンプル:開発環境の確認
# Javaバージョンの確認 (17+必須)
java -version
# openjdk version "17.0.9"
# Mavenの確認
mvn -version
# Apache Maven 3.9.6
# Gitの確認
git --version
# git version 2.43.0
出力:
# コマンド実行成功
7. OrderFlow:プロジェクトの背景とコースロードマップ
(1) OrderFlowのビジネスシナリオ
Aliceが開発したOrderFlowは, マイクロサービスベースの電子商取引注文管理システムです。主な機能は以下の通りです。
| モジュール | 機能 | 技術的ハイライト |
|---|---|---|
| 商品管理 | CRUD / キャッシュ / 検索 | JPA + Redis + Caffeine |
| 注文管理 | 注文作成 / 注文キャンセル / タイムアウト自動キャンセル | トランザクション + スケジュールタスク + 非同期処理 |
| ユーザー認証 | 登録 / ログイン / ロール権限 | Spring Security + JWT |
| 運用・監視 | ヘルスチェック / メトリクス / トレース | Actuator + Prometheus + Grafana |
(2) コースロードマップ
graph LR
P1["フェーズ1<br/>入門編<br/>L01-L06"] --> P2["フェーズ2<br/>核心機能編<br/>L07-L12"]
P2 --> P3["フェーズ3<br/>応用機能編<br/>L13-L18"]
P3 --> P4["フェーズ4<br/>管理・運用編<br/>L19-L23"]
P4 --> P5["フェーズ5<br/>総合実践編<br/>L24-L26"]
8. 総合サンプル:OrderFlowプロジェクトの作成と環境確認
// OrderflowServiceApplication.java
package com.orderflow;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class OrderflowServiceApplication {
public static void main(String[] args) {
SpringApplication.run(OrderflowServiceApplication.class, args);
}
}
// controller/HealthController.java
package com.orderflow.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
@RestController
public class HealthController {
@GetMapping("/api/health")
public Map<String, Object> health() {
return Map.of(
"status", "UP",
"service", "OrderFlow",
"version", "1.0.0"
);
}
}
$ curl http://localhost:8080/api/health
{"status":"UP","service":"OrderFlow","version":"1.0.0"}
❓ よくある質問
recordはすべてのPOJOを置き換えられますか?recordは不変のデータ転送オブジェクト (DTO)に適しています。JPAエンティティ (可変性と引数なしコンストラクタが必要)が必要な場合は, 通常のクラスを使用してください。📖 まとめ
- Spring Bootの3つの核心機能:自動設定, スターター依存関係, 組み込みコンテナ—XML設定の悪夢とお別れ
- Spring Boot 3.xはJava 17以降が必要で, パッケージ名が
javaxからjakartaに変更 - Java 17の新機能:record (不変DTO), sealed class (継承制限), text block (複数行文字列)
- Spring Initializrでプロジェクトスキャフォールディングを迅速生成, IDE統合でさらに便利
- OrderFlow電子商取引注文管理がチュートリアル全体を貫くビジネスシナリオ
📝 練習問題
-
基本問題 (難易度 ⭐):Spring Initializrを使って
spring-boot-starter-web依存関係を含むSpring Boot 3.xプロジェクトを作成してください。プロジェクト実行後,/api/healthにアクセスして{"status":"UP"}を返すようにしてください。 -
応用問題 (難易度 ⭐⭐):プロジェクト内に
id,name,priceフィールドを持つProductレコードを定義し, ハードコードされた商品一覧を返すProductControllerを作成してください。 -
チャレンジ問題 (難易度 ⭐⭐⭐):
sealed interfaceを使ってOrderStatusを定義し (PENDING,CONFIRMED,SHIPPED,CANCELLEDの4つの実装を含む), コントローラで各ステータスに応じて異なるHTTPステータスコードを返すようにしてください。



