😊

Spring BootでのEntity + Repository実装&JPAによるDB操作まとめ

に公開

はじめに

現在、Spring Bootを使って「イベント予約管理システム」を開発中です。

このアプリは、イベントの一覧を表示したり、予約を行ったりできる、シンプルかつ実用的なWebアプリを目指しています。

今回は、いよいよ データベースと連携する処理 に取り組みました!

具体的には、以下のような流れで実装を進めています:

  • Entity(エンティティ)の作成
  • Repository(リポジトリ)の実装
  • テストデータの登録(CommandLineRunner)
  • ブラウザでデータの確認(H2コンソール)

これまでの記事も併せてご覧ください

実施したことの流れ

今回は、Spring Bootアプリとデータベース(H2)を連携させるために、以下のステップで開発を進めました。

  1. データベースのテーブル設計
     予約システムに必要な「ユーザー」「イベント」「予約」の3つのテーブルを設計しました。

  2. Entityの作成
     各テーブルに対応するJavaクラス(エンティティ)を作成し、JPAのアノテーションでマッピングしました。

  3. Repositoryの作成
     Entityに対応するリポジトリインターフェースを作成し、データの取得や保存を簡単に行えるようにしました。

  4. テストレコードの追加
     ApplicationRunner を使って、アプリ起動時にサンプルデータが登録されるようにしました。

  5. ブラウザでデータを確認
     H2コンソールを有効にして、Webブラウザからデータベースの中身を確認しました。

今回のDBテーブル紹介

今回作成したデータベースには、以下の3つのテーブルがあります。
それぞれ、エンティティ(Javaクラス)と1対1で対応しています。

User(ユーザー情報)

カラム名 備考
id Long 主キー
name String ユーザー名
email 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操作(savefindAllfindByIddeleteなど)を自動で実装してくれるインターフェースです。

このように、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)

  1. アプリを起動した状態で、ブラウザを開きます。
  2. http://localhost:8080/h2-console にアクセスします。
  3. 以下の情報を入力して、「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