4.プロジェクトの準備
学習目標
- Spring Initializr でプロジェクトを作成できる
- compose.yaml と init.sql をプロジェクトに置き、チームで同じ MySQL を共有できる
- 設計で決めたテーブル(利用者・質問・回答・投票)と初期データを init.sql に書ける
- application.properties で、用意した MySQL にアプリケーションを接続できる
- docker compose で MySQL を起動し、接続を確認できる
設計 でデータ構造を決めました。本章では、Spring Boot のプロジェクトを作成し、アプリケーションが使う MySQL を用意して、両者を接続します。プロジェクトは最初の 1 人が作成し、バージョン管理 でチームに共有します。
1. プロジェクトの作成
Section titled “1. プロジェクトの作成”アプリケーションは Spring Boot のプロジェクトです。Spring Initializr で雛形を生成します。
1-1. Spring Initializr での生成
Section titled “1-1. Spring Initializr での生成”-
Spring Initializr を開く
コマンドパレット(
Ctrl + Shift + P)でSpring Initializr: Create a Maven Projectを選びます。 -
プロジェクトの設定を選ぶ
Spring Boot のバージョン(最新の安定版)、グループ名(
com.example)、アーティファクト名(qa_app)、パッケージング形式(Jar)、Java のバージョン(25)を順に選びます。 -
プロジェクトを開く
生成先のフォルダーを指定し、生成されたプロジェクトを開きます。
1-2. 依存関係
Section titled “1-2. 依存関係”依存関係の選択画面で、次を選びます。
| 依存関係 | 用途 |
|---|---|
| Spring Web | Web の機能と組み込み Tomcat |
| Thymeleaf | 画面の HTML テンプレート |
| JDBC API | JdbcClient による MySQL アクセス |
| MySQL Driver | MySQL への接続ドライバー |
| Validation | フォームに送られた入力値の検証 |
| Spring Boot DevTools | コードやテンプレートの変更の反映 |
Spring Boot 入門 で選んだ依存関係に、フォームの検証を行う Validation を加えた構成です。パスワードのハッシュ化に使う spring-security-crypto は Initializr の一覧にないため、認証を実装するときに pom.xml に追加します(ログイン認証)。
2. MySQL の用意
Section titled “2. MySQL の用意”チームでは、全員が同じ MySQL を同じデータで使います。環境構築 と同じく、Docker Compose の定義 compose.yaml と初期データ init.sql をプロジェクトのルートに置き、リポジトリで共有します。
Directoryプロジェクトのルート/
- compose.yaml
- init.sql
Directorysrc/
- …
- pom.xml
2-1. compose.yaml
Section titled “2-1. compose.yaml”MySQL のコンテナーを 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 です。各設定の意味は 環境構築 と同じです。
2-2. スキーマと初期データ
Section titled “2-2. スキーマと初期データ”新しい MySQL は空のため、設計 で決めたテーブルと初期データを init.sql に書きます。compose.yaml の volumes で /docker-entrypoint-initdb.d に対応づけているため、コンテナーの初回起動時に実行されます。
Q&A サイトは、利用者・質問・回答・投票の 4 つを扱います。質問と回答は利用者が投稿し、投票は回答に対して行われます。この関係を、テーブルと外部キーで表します。
-- 利用者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_id は users.id を指し、質問とその投稿者を結びつけます。votes の UNIQUE (answer_id, voter_id) は、同じ利用者による同じ回答への二重投票を防ぎます。テーブル設計の根拠は 設計 で扱います。
init.sql は初回起動時にだけ実行されます。内容を変更して反映するには、docker compose down -v でボリュームを削除し、docker compose up -d で再作成します。-v を付けない docker compose down と docker compose stop は、データを残して停止します。
3. アプリケーションからの接続
Section titled “3. アプリケーションからの接続”MySQL を用意したら、アプリケーションの接続先を設定し、起動して確認します。
3-1. 接続設定
Section titled “3-1. 接続設定”接続情報は、サービスとリポジトリ と同じく application.properties に書きます。接続先は、compose.yaml で公開した 127.0.0.1:3307 の qa_app です。
spring.datasource.url=jdbc:mysql://127.0.0.1:3307/qa_appspring.datasource.username=rootspring.datasource.password=root3-2. 起動と確認
Section titled “3-2. 起動と確認”-
MySQL を起動する
compose.yamlのあるフォルダーで実行します。Terminal window docker compose up -d -
アプリケーションを起動する
MySQL はコンテナーで、アプリケーション本体は
Runで起動します。Spring Boot 入門 と同じRunのほか、VS Code の Spring Boot Dashboard からも起動・停止・再起動を操作できます。 -
起動を確認する
ブラウザーで
http://localhost:8080を開くと、Whitelabel Error Page が表示されます。画面をまだ実装していないため、これが正しく起動した状態です。MySQL のデータは、DB クライアントで127.0.0.1:3307のqa_appに接続し、init.sqlのテーブルとデータが作成されていることを確認できます。
4. README
Section titled “4. README”README は、プロジェクトの起動と開発に必要な情報をまとめた文書です。プロジェクトのルートに 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 の手順に従って同じ環境を再現します。
作成者の環境で動作を確認したら、このプロジェクトをチームで共有します。共有の手順は、バージョン管理 で扱います。