はじめに
JavaのSpringフレームワークはちょこちょこ触ってきた。
途中でPythonにどっぷり浮気して、FastAPIやFlaskでAPI作ったりもした。
でも「Spring Boot」は、なんとなく後回しにしてきた。
理由は正直シンプルで、「設定多そう」「重そう」というイメージ。
ですが、最近のJava案件では、Spring Bootが多いイメージになりました。
これはやらねば…と重い腰を上げました。
この記事は、「Javaは知ってるけどSpring Bootはほぼ初めて」なエンジニアのメモです。
環境はMac M1 Pro。まずはローカルで動かすところまでをまとめます。
対象読者
- Java(Spring含む)は触ったことがある
- PythonやFastAPIなど他言語のフレームワーク経験あり
- Spring Bootはほぼ未経験
- Mac M1 Pro使用中
環境
| 項目 | バージョン |
|---|---|
| macOS | Sonoma 14.x(M1 Pro) |
| Java | 21(LTS) |
| Spring Boot | 4.0.6 |
| ビルドツール | Maven |
| IDE | IntelliJ IDEA Community / VS Code |
なぜJava 21?
Spring Boot 4.x系はJava 17以上が必須です。17・21どちらでも動きますが、安定したLTSバージョンとして広く普及している21を選択しました。
1. Javaのインストール
M1 MacではHomebrewで入れるのが最も楽です。
Homebrewがない場合はまず導入
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
SDKMANで管理する(おすすめ)
複数バージョンを切り替えたい場合はSDKMANが便利です。Pythonでいうpyenvのようなものです。
curl -s "https://get.sdkman.io" | bash
source "$HOME/.sdkman/bin/sdkman-init.sh"
# 利用可能なJavaを確認
sdk list java
# Java 21(Temurin)をインストール
# ※ sdk list java で表示される最新の21系パッチバージョンを選んでください
sdk install java 21.0.7-tem
# バージョン確認
java -version
openjdk version "21.0.7" 2025-04-15
OpenJDK Runtime Environment Temurin-21.0.7+6 (build 21.0.7+6)
OpenJDK 64-Bit Server VM Temurin-21.0.7+6 (build 21.0.7+6, mixed mode)
Homebrewで入れる場合
brew install openjdk@21 echo 'export PATH="/opt/homebrew/opt/openjdk@21/bin:$PATH"' >> ~/.zshrc source ~/.zshrc
2. プロジェクトの雛形を作成する
Spring BootにはSpring Initializrというプロジェクト生成ツールがあります。
FastAPIのpip install fastapiしてサクッと書き始めるのと違い、Spring Bootはまず「プロジェクトの雛形」を作るところから始まります。
ブラウザから生成する場合
👉 https://start.spring.io にアクセス
以下のように設定します。
| 項目 | 設定値 |
|---|---|
| Project | Maven |
| Language | Java |
| Spring Boot | 4.0.6 |
| Group | com.example |
| Artifact | demo |
| Packaging | Jar |
| Java | 21 |
**Dependencies(依存関係)**に以下を追加:
-
Spring Web← REST APIを作るのに必要 -
Spring Boot DevTools← ホットリロード用(開発中に便利) -
Lombok← ボイラープレートコードを削減
「GENERATE」ボタンでzipをダウンロード → 任意の場所に展開。
CLIから生成する場合(Spring CLI)
# Spring CLIをSDKMANでインストール
sdk install springboot
# プロジェクト生成
spring init \
--dependencies=web,devtools,lombok \
--java-version=21 \
--build=maven \
--name=demo \
demo
3. プロジェクト構成を確認する
demo/
├── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/example/demo/
│ │ │ └── DemoApplication.java ← エントリポイント
│ │ └── resources/
│ │ ├── application.properties ← 設定ファイル
│ │ ├── static/
│ │ └── templates/
│ └── test/
│ └── java/
│ └── com/example/demo/
│ └── DemoApplicationTests.java
└── pom.xml ← 依存関係の定義(Mavenの場合)
Pythonとの比較で言うと:
| Spring Boot | Python(FastAPI) |
|---|---|
pom.xml |
pyproject.toml / requirements.txt
|
DemoApplication.java |
main.py |
application.properties |
.env / config.py
|
4. アプリを起動してみる
IDEで起動
IntelliJ IDEAなら DemoApplication.java を開いて、main メソッド左の▶ボタンをクリックするだけです。
ターミナルから起動
cd demo
./mvnw spring-boot:run
初回はMavenが依存関係をダウンロードするのでしばらくかかります(2〜3分程度)。
起動すると以下のようなログが流れます:
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_|_|_|_|_|\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v4.0.6)
... Started DemoApplication in 2.345 seconds (process running for 2.6)
http://localhost:8080 にアクセスして「Whitelabel Error Page」が表示されればOK!
(エンドポイントを何も定義していないので404相当のエラーページが出ますが、起動はできています)
5. はじめてのREST API
せっかくなのでシンプルなエンドポイントを作ってみましょう。
src/main/java/com/example/demo/ に HelloController.java を作成します。
package com.example.demo;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello(@RequestParam(defaultValue = "World") String name) {
return "Hello, " + name + "!";
}
}
アプリを再起動(DevToolsがあれば自動リロード)して:
curl http://localhost:8080/hello
# Hello, World!
curl "http://localhost:8080/hello?name=Taro"
# Hello, Taro!
Pythonで書くとこんな感じ(FastAPI):
from fastapi import FastAPI
app = FastAPI()
@app.get("/hello")
def hello(name: str = "World"):
return f"Hello, {name}!"
アノテーションの思想はほぼ同じですね。@RestController が app = FastAPI() に相当し、@GetMapping が @app.get() に相当するイメージです。
M1 Pro特有の注意点
アーキテクチャについて
M1 MacはARM64アーキテクチャです。Java 21(Temurin)はApple Silicon対応ビルドが提供されているので、上記の手順通りに入れれば問題なく動きます。
Dockerを使う場合
今後Docker上でSpring Bootを動かす場合、イメージのアーキテクチャに注意が必要です。
# docker-compose.yml
services:
app:
platform: linux/arm64 # M1の場合はこれを明示
build: .
linux/amd64 のイメージを使うとRosetta 2経由になり、起動が遅くなります。
まとめ
| やったこと | 内容 |
|---|---|
| Java 21インストール | SDKMANを使ってM1対応ビルドを導入 |
| プロジェクト生成 | Spring Initializrで雛形作成 |
| アプリ起動 |
./mvnw spring-boot:run でローカル起動 |
| REST API作成 |
@RestController でHello Worldエンドポイント |
「設定多そう」「重そう」というイメージを持っていましたが、Spring Initializrのおかげでプロジェクト作成は拍子抜けするくらいシンプルでした。
Pythonと比べると型が明示的な分、コードが冗長に見えますが、Lombokを使うとだいぶスッキリするらしいので次回以降で試していきます。
次回は Spring Data JPAとPostgreSQLでDB連携 をやる予定です。