Spring BootでのEntity + Repository実装&JPAによるDB操作まとめ
はじめに
現在、Spring Bootを使って「イベント予約管理システム」を開発中です。
このアプリは、イベントの一覧を表示したり、予約を行ったりできる、シンプルかつ実用的なWebアプリを目指しています。
今回は、いよいよ データベースと連携する処理 に取り組みました!
具体的には、以下のような流れで実装を進めています:
- Entity(エンティティ)の作成
- Repository(リポジトリ)の実装
- テストデータの登録(CommandLineRunner)
- ブラウザでデータの確認(H2コンソール)
これまでの記事も併せてご覧ください
実施したことの流れ
今回は、Spring Bootアプリとデータベース(H2)を連携させるために、以下のステップで開発を進めました。
-
データベースのテーブル設計
予約システムに必要な「ユーザー」「イベント」「予約」の3つのテーブルを設計しました。 -
Entityの作成
各テーブルに対応するJavaクラス(エンティティ)を作成し、JPAのアノテーションでマッピングしました。 -
Repositoryの作成
Entityに対応するリポジトリインターフェースを作成し、データの取得や保存を簡単に行えるようにしました。 -
テストレコードの追加
ApplicationRunner
を使って、アプリ起動時にサンプルデータが登録されるようにしました。 -
ブラウザでデータを確認
H2コンソールを有効にして、Webブラウザからデータベースの中身を確認しました。
今回のDBテーブル紹介
今回作成したデータベースには、以下の3つのテーブルがあります。
それぞれ、エンティティ(Javaクラス)と1対1で対応しています。
User
(ユーザー情報)
① カラム名 | 型 | 備考 |
---|---|---|
id | Long | 主キー |
name | String | ユーザー名 |
String | メールアドレス |
Event
(イベント情報)
② カラム名 | 型 | 備考 |
---|---|---|
id | Long | 主キー |
title | String | イベント名 |
date | LocalDateTime | 開催日時 |
Reservation
(予約情報)
③ カラム名 | 型 | 備考 |
---|---|---|
id | Long | 主キー |
user_id | Long |
User への外部キー |
event_id | Long |
Event への外部キー |
reserved_at | LocalDateTime | 予約日時 |
フォルダ構成と各ディレクトリの説明
Spring Bootでは、以下のようなフォルダ構成で開発を進めています。
src/
└─ main/
├─ java/
│ └─ com/
│ └─ example/
│ └─ event_reservation_app/
│ ├─ EventReservationAppApplication.java ← メインクラス(@SpringBootApplication)
│ ├─ entity/ ← Entityクラスを入れる(DBモデル)
│ ├─ repository/ ← Repositoryインターフェース
│ ├─ controller/ ← Web/APIコントローラー
│ └─ service/ ← ビジネスロジック(予約処理など)
└─ resources/ ← 設定ファイルやHTMLなど
├─ application.properties
└─ templates/、static/(HTML・CSS・JSなど)
各ディレクトリの役割
ディレクトリ名 | 役割説明 |
---|---|
entity/ |
データベースのテーブルに対応するクラスを定義(@Entity を使ってマッピング) |
repository/ |
DB操作(CRUDなど)を行うインターフェース。JPAの仕組みで自動実装されます。 |
service/ |
ビジネスロジックを記述する層。コントローラーから呼び出されます。 |
controller/ |
WebページやAPIの入り口となるクラス(画面遷移やリクエスト処理など) |
resources/ |
設定ファイル、HTMLテンプレート、静的リソース(CSS/JSなど)を配置します。 |
この構成をベースに、今後の画面表示やAPI開発も進めていく予定です
Entity実装
Entityとは?
Entity(エンティティ)は、データベースのテーブルと1対1で対応するJavaクラスです。
Spring BootではJPA(Java Persistence API)を使って、クラスとテーブルをマッピングします。
- 各Entityは
@Entity
アノテーションを使って定義します。 - クラス名は基本的にテーブル名と対応させます(自動でスネークケースに変換されます)。
- プライマリキーには
@Id
と@GeneratedValue
を使って自動採番もできます。
Reservationエンティティの実装例
以下は予約情報を表す Reservation
クラスのコードです。
User
(予約したユーザー)や Event
(予約対象のイベント)と関連付けられています。
package com.example.event_reservation_app.entity;
import jakarta.persistence.*;
import java.time.LocalDateTime;
@Entity
@Table(name = "reservations")
public class Reservation {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "user_id", nullable = false)
private User user;
@ManyToOne
@JoinColumn(name = "event_id", nullable = false)
private Event event;
@Column(name = "reserved_at")
private LocalDateTime reservedAt;
public Reservation() {
// JPA用のデフォルトコンストラクタ
}
// --- Getter & Setter ---
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public Event getEvent() {
return event;
}
public void setEvent(Event event) {
this.event = event;
}
public LocalDateTime getReservedAt() {
return reservedAt;
}
public void setReservedAt(LocalDateTime reservedAt) {
this.reservedAt = reservedAt;
}
}
ポイント解説
アノテーション | 説明 |
---|---|
@Entity |
このクラスがJPAのエンティティであることを示します。 |
@Table(name = "...") |
マッピングするテーブル名を指定します(省略時はクラス名が使われます)。 |
@Id |
主キー(Primary Key)であることを表します。 |
@GeneratedValue |
IDを自動採番する方法を指定します。ここでは IDENTITY (DB依存で採番)を使用。 |
@ManyToOne |
多対一のリレーション。複数の予約が1人のユーザー・1つのイベントに紐づく関係です。 |
@JoinColumn |
外部キーとして使うカラム名を明示的に指定します。 |
このように、JPAではアノテーションを使ってJavaクラスをDBテーブルとして扱えるようにします。
SQLを書く必要がないので、実装の生産性がとても高くなります。
Repository実装
Repositoryとは?
Repository(リポジトリ)は、データベースとのやり取り(CRUD操作)を担うインターフェースです。
Spring Data JPAを使えば、SQLを書かずにデータの取得・保存・更新・削除などができます。
基本構成
-
Repositoryは通常、
JpaRepository<T, ID>
を継承します。-
T
… 対象のEntityクラス -
ID
… 主キーの型(例:Long
)
-
-
Springが自動で実装クラスを生成してくれるので、コードはインターフェースだけでOKです。
ReservationRepositoryの例
以下は、予約情報を扱う Reservation
エンティティに対応するリポジトリです。
package com.example.event_reservation_app.repository;
import com.example.event_reservation_app.entity.Reservation;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface ReservationRepository extends JpaRepository<Reservation, Long> {
}
ポイント解説
項目 | 説明 |
---|---|
@Repository |
このインターフェースがリポジトリであることを示します(省略しても動作しますが、記述するのが一般的です)。 |
JpaRepository<Entity, ID> |
Spring Data JPA が提供する基本的なDB操作(save 、findAll 、findById 、delete など)を自動で実装してくれるインターフェースです。 |
このように、SQLを書かずにDBと連携できるのが Spring Data JPAの大きな魅力 です。
pom.xml
の設定
pom.xml
とは?
pom.xml
は、Mavenプロジェクトの構成ファイルです。
主に以下のような内容を定義します:
- 使用するライブラリ(依存関係)
- JavaやSpring Bootのバージョン
- プロジェクトのビルド方法 など
今回の設定内容
データベース連携とJPAを使うために、以下の依存関係を追加します:
<dependencies>
<!-- Spring Boot Web(Webアプリ用) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Boot Test(テスト用) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- JPA(永続化 + ORM) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- H2 Database(組み込みDB) -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
ポイント解説
依存関係名 | 役割 |
---|---|
spring-boot-starter-web |
Webアプリケーションを作るための基本的な機能(MVCやREST)を提供します。 |
spring-boot-starter-test |
単体テストや統合テストに必要なライブラリが含まれています。 |
spring-boot-starter-data-jpa |
JPA(Java Persistence API)によるDB操作機能を提供します。 |
h2 |
組み込みの軽量データベース。開発やテストに便利です。 |
この設定をしておくことで、JPAやH2 DBを使った開発がスムーズに進められます。
テストデータの追加
アプリを起動したときに、テスト用のイベントデータを1件だけ自動登録する処理を追加します。
Spring Bootの ApplicationRunner
を使えば、アプリ起動時に任意の処理を実行できます。
TestDataLoader.java
実装クラス:package com.example.event_reservation_app.config;
import com.example.event_reservation_app.entity.Event;
import com.example.event_reservation_app.repository.EventRepository;
import org.springframework.boot.ApplicationRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.time.LocalDateTime;
@Configuration
public class TestDataLoader {
@Bean
public ApplicationRunner dataLoader(EventRepository eventRepository) {
return args -> {
Event event = new Event();
event.setTitle("テストイベント");
event.setDate(LocalDateTime.now().plusDays(1));
eventRepository.save(event);
eventRepository.findAll().forEach(e ->
System.out.println("登録イベント: " + e.getTitle() + " / " + e.getDate())
);
};
}
}
ポイント解説
項目 | 説明 |
---|---|
@Configuration |
このクラスが設定クラスであることを示します。 |
@Bean |
ApplicationRunner をBeanとして登録し、アプリ起動時に実行します。 |
ApplicationRunner |
起動直後に1回だけ実行される処理を定義できます。 |
EventRepository.save() |
データベースに新しいイベントを保存します。 |
この方法で、毎回アプリを起動するたびにテストデータが登録されるようになります。
開発初期や確認作業にとても便利なテクニックです。
ブラウザでデータを確認(H2 Console)
Spring Bootでは、組み込みのデータベース「H2」を使えば、ブラウザからテーブルやデータの中身を簡単に確認できます!
application.properties
の設定
H2 Consoleを使うには、設定ファイルに以下のように追記します。
spring.application.name=event-reservation-app
# H2 Console の有効化
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console
# JDBC URL と接続情報
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
# Hibernate設定(テーブル自動作成)
spring.jpa.hibernate.ddl-auto=update
application.propertiesファイルとは?
application.properties
は、Spring Bootアプリの動作設定をまとめて書くファイルです。
ここに書くことで、
- データベースの接続情報(URL、ユーザー名、パスワード)
- サーバーのポート番号
- ログの出力レベル
- H2データベースのコンソールの有効化
などを簡単に管理できます。
今回のように設定しておくことで、開発中にブラウザからH2コンソールを使って
テーブルの中身を確認したり、アプリの動作をカスタマイズしたりできます。
アクセス手順(H2 Console)
- アプリを起動した状態で、ブラウザを開きます。
-
http://localhost:8080/h2-console
にアクセスします。 - 以下の情報を入力して、「Connect」ボタンをクリックします。
項目 | 入力内容 |
---|---|
JDBC URL | jdbc:h2:mem:testdb |
Username | sa |
Password | 空欄のままでOK |
テーブルとデータの確認
ログインに成功すると、以下のような画面が表示されます:
- 左側のツリービューに
USER
,EVENT
,RESERVATION
の各テーブルが表示されていることを確認します。 - 任意のテーブル名をクリックし、
SELECT * FROM event;
のようなクエリを実行すると、登録されているデータを確認できます。
注意点
- この H2コンソールは開発中だけ使用 することを想定しています。本番環境では無効化するようにしましょう。
- メモリDB(
mem:
)を使用しているため、アプリを再起動するとデータはリセットされます。必要に応じて永続化DBの利用を検討してください。
おわりに
今回は、Spring BootでのEntityとRepositoryの基本的な実装方法と、JPAを使ったデータベース連携を体験しました。
- データベースのテーブル設計からエンティティの作成
- Repositoryの実装によるCRUD操作の簡略化
- テストデータの登録方法
- ブラウザのH2コンソールを使ったデータ確認
これらのステップを通して、JPAの便利さとSpring Bootでの開発の効率化を実感できたと思います。
次回は、今回登録したデータを実際に画面に表示したり、ユーザーが予約できる機能を実装していく予定です。
Discussion