Skip to content
Playground

4.プロジェクトの準備

学習目標

  • Spring Initializr でプロジェクトを作成できる
  • compose.yaml と init.sql をプロジェクトに置き、チームで同じ MySQL を共有できる
  • 設計で決めたテーブル(利用者・質問・回答・投票)と初期データを init.sql に書ける
  • application.properties で、用意した MySQL にアプリケーションを接続できる
  • docker compose で MySQL を起動し、接続を確認できる

設計 でデータ構造を決めました。本章では、Spring Boot のプロジェクトを作成し、アプリケーションが使う MySQL を用意して、両者を接続します。プロジェクトは最初の 1 人が作成し、バージョン管理 でチームに共有します。

アプリケーションは Spring Boot のプロジェクトです。Spring Initializr で雛形を生成します。

  1. Spring Initializr を開く

    コマンドパレット(Ctrl + Shift + P)で Spring Initializr: Create a Maven Project を選びます。

  2. プロジェクトの設定を選ぶ

    Spring Boot のバージョン(最新の安定版)、グループ名(com.example)、アーティファクト名(qa_app)、パッケージング形式(Jar)、Java のバージョン(25)を順に選びます。

  3. プロジェクトを開く

    生成先のフォルダーを指定し、生成されたプロジェクトを開きます。

依存関係の選択画面で、次を選びます。

依存関係用途
Spring WebWeb の機能と組み込み Tomcat
Thymeleaf画面の HTML テンプレート
JDBC APIJdbcClient による MySQL アクセス
MySQL DriverMySQL への接続ドライバー
Validationフォームに送られた入力値の検証
Spring Boot DevToolsコードやテンプレートの変更の反映

Spring Boot 入門 で選んだ依存関係に、フォームの検証を行う Validation を加えた構成です。パスワードのハッシュ化に使う spring-security-crypto は Initializr の一覧にないため、認証を実装するときに pom.xml に追加します(ログイン認証)。

チームでは、全員が同じ MySQL を同じデータで使います。環境構築 と同じく、Docker Compose の定義 compose.yaml と初期データ init.sql をプロジェクトのルートに置き、リポジトリで共有します。

  • Directoryプロジェクトのルート/
    • compose.yaml
    • init.sql
    • Directorysrc/
    • pom.xml

MySQL のコンテナーを compose.yaml に定義します。

compose.yaml
services:
db:
image: mysql:8.4
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: qa_app
ports:
- "3307:3306"
volumes:
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
- db-data:/var/lib/mysql
volumes:
db-data:

データベース名は qa_app、PC 側のポートは 3307 です。各設定の意味は 環境構築 と同じです。

新しい MySQL は空のため、設計 で決めたテーブルと初期データを init.sql に書きます。compose.yamlvolumes/docker-entrypoint-initdb.d に対応づけているため、コンテナーの初回起動時に実行されます。

Q&A サイトは、利用者・質問・回答・投票の 4 つを扱います。質問と回答は利用者が投稿し、投票は回答に対して行われます。この関係を、テーブルと外部キーで表します。

init.sql
-- 利用者
CREATE TABLE users (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(255) NOT NULL UNIQUE,
password_hash VARCHAR(255) NOT NULL,
reputation INT NOT NULL DEFAULT 0,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
);
-- 質問(利用者が投稿する)
CREATE TABLE questions (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
author_id BIGINT NOT NULL,
title VARCHAR(255) NOT NULL,
body TEXT NOT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (author_id) REFERENCES users(id)
);
-- 回答(質問に対して利用者が投稿する)
CREATE TABLE answers (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
question_id BIGINT NOT NULL,
author_id BIGINT NOT NULL,
body TEXT NOT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (question_id) REFERENCES questions(id),
FOREIGN KEY (author_id) REFERENCES users(id)
);
-- 投票(同じ回答への投票は 1 人 1 回まで)
CREATE TABLE votes (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
answer_id BIGINT NOT NULL,
voter_id BIGINT NOT NULL,
FOREIGN KEY (answer_id) REFERENCES answers(id),
FOREIGN KEY (voter_id) REFERENCES users(id),
UNIQUE (answer_id, voter_id)
);
INSERT INTO users (username, password_hash, reputation) VALUES
('alice', '$2a$10$......(生成したハッシュ)......', 50),
('bob', '$2a$10$......(生成したハッシュ)......', 5);
INSERT INTO questions (author_id, title, body) VALUES
(1, 'Spring Boot で MySQL に接続するには?', 'application.properties に何を書けばよいですか。'),
(1, 'Docker Compose で MySQL を起動したい', 'compose.yaml の書き方を教えてください。');
INSERT INTO answers (question_id, author_id, body) VALUES
(1, 2, 'spring.datasource.url・username・password を設定します。'),
(1, 1, 'MySQL Driver の依存も必要です。');
INSERT INTO votes (answer_id, voter_id) VALUES
(1, 1);

外部キーは、ある行が別のテーブルのどの行に属するかを表します。questions.author_idusers.id を指し、質問とその投稿者を結びつけます。votesUNIQUE (answer_id, voter_id) は、同じ利用者による同じ回答への二重投票を防ぎます。テーブル設計の根拠は 設計 で扱います。

init.sql は初回起動時にだけ実行されます。内容を変更して反映するには、docker compose down -v でボリュームを削除し、docker compose up -d で再作成します。-v を付けない docker compose downdocker compose stop は、データを残して停止します。

3. アプリケーションからの接続

Section titled “3. アプリケーションからの接続”

MySQL を用意したら、アプリケーションの接続先を設定し、起動して確認します。

接続情報は、サービスとリポジトリ と同じく application.properties に書きます。接続先は、compose.yaml で公開した 127.0.0.1:3307qa_app です。

src/main/resources/application.properties
spring.datasource.url=jdbc:mysql://127.0.0.1:3307/qa_app
spring.datasource.username=root
spring.datasource.password=root
  1. MySQL を起動する

    compose.yaml のあるフォルダーで実行します。

    Terminal window
    docker compose up -d
  2. アプリケーションを起動する

    MySQL はコンテナーで、アプリケーション本体は Run で起動します。Spring Boot 入門 と同じ Run のほか、VS Code の Spring Boot Dashboard からも起動・停止・再起動を操作できます。

  3. 起動を確認する

    ブラウザーで http://localhost:8080 を開くと、Whitelabel Error Page が表示されます。画面をまだ実装していないため、これが正しく起動した状態です。MySQL のデータは、DB クライアントで 127.0.0.1:3307qa_app に接続し、init.sql のテーブルとデータが作成されていることを確認できます。

README は、プロジェクトの起動と開発に必要な情報をまとめた文書です。プロジェクトのルートに README.md として置き、リポジトリで共有します。概要・技術スタック・前提ツール・セットアップ手順・データベースの操作・テストの実行・開発の進め方を記載します。

README.md
# Q&A サイト
開発者が質問を投稿し、回答への投票で最良の回答を見つける Q&A サイトです。
## 技術スタック
- Java 25
- Spring Boot(Web / Thymeleaf / JDBC)
- MySQL 8.4
- Docker Compose
## 前提
- Docker Desktop
- JDK 25
- VS Code(Spring Boot Extension Pack)
## セットアップ
1. リポジトリをクローンします。
2. `docker compose up -d` で MySQL を起動します。
3. メインクラスの `Run`、または Spring Boot Dashboard でアプリケーションを起動します。
4. ブラウザーで `http://localhost:8080` を開きます。
## データベース
- 接続先: `127.0.0.1:3307`
- データベース名: `qa_app`
- ユーザー / パスワード: `root` / `root`
スキーマと初期データは `init.sql` に定義し、コンテナーの初回起動時に実行されます。内容を変更したときは、`docker compose down -v` でボリュームを削除してから `docker compose up -d` で再作成します。
## テスト
`./mvnw test` を実行します。
## 開発の進め方
- 作業ごとにブランチを作成し、プルリクエストのレビューを経て main にマージします。
- コミットメッセージの先頭に種別(`feat` / `fix` / `docs` / `refactor` / `chore`)を付けます。

クローンしたメンバーは、README の手順に従って同じ環境を再現します。

作成者の環境で動作を確認したら、このプロジェクトをチームで共有します。共有の手順は、バージョン管理 で扱います。