はじめに
自身の知識のアウトプットも兼ねて、新人研修用に作成した記事となります。Spring Bootを学び始めた方を対象とした内容になっています。
環境要件
OS:Windows 10 Pro
Java:17.0.2
Spring Boot:3.3.4
DB:XAMPP(MySQL 10.4.21-MariaDB)
IDE:Spring Tool Suite 4(STS)
依存関係
新規プロジェクト作成時に、依存関係(機能)を追加します。
今回追加した依存関係は以下の通りです。
Lombok
Javaプログラミングにおける便利なライブラリで、コードの冗長性を減らし、開発効率を向上させます。アノテーションを用いることで、getterやsetter、toStringメソッドなどのボイラープレートコードを自動生成し、手動での記述を不要にします。
MySQL Driver
Spring BootアプリケーションがMySQLデータベースへ接続するために使用されるJDBCドライバです。MySQL Connector/Jが一般的に使用されます。
Spring-Boot Devtools
Spring Bootアプリケーションの開発を効率化するための追加ツールセットです。このモジュールは、開発中のアプリケーションに対して自動再起動やキャッシュの無効化などを提供し、コード変更に対する迅速なフィードバックループを実現します。
Spring-Data-JPA
Springフレームワークの一部であり、Java Persistence API(JPA)を使用してデータベースアクセスを簡素化するためのライブラリです。
Spring Web
Webアプリケーションの構築を効率化するための多くの機能を提供します。
Thymeleaf
Javaで書かれたテンプレートエンジンであり、特にSpring Bootアプリケーションで広く使用されています。Thymeleafは、HTMLやXMLをテンプレートとして使用し、動的なコンテンツを生成するための機能を提供します。
Validation
ユーザーからの入力データが正しいかどうかを検証するための機能です。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.4</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>crud_sample</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>crud_sample</name>
<description>Demo project for Spring Boot</description>
<url/>
<licenses>
<license/>
</licenses>
<developers>
<developer/>
</developers>
<scm>
<connection/>
<developerConnection/>
<tag/>
<url/>
</scm>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
データベースを作成する
phpMyAdminなどのGUIやXAMPPコントロールパネルにあるshellを利用してデータベースを作成してください。
XAMPPのshellから実行する場合のコマンドは下記の通りです。
# MySQLに接続
$ mysql -u root -p
# MySQLに接続後、DB作成
CREATE DATABASE sample;
# DB作成後、MySQLから抜ける
exit
DB接続情報
# MySQLの接続設定
spring.datasource.url=jdbc:mysql://localhost:3306/sample
spring.datasource.username=root
spring.datasource.password=
# Spring-JPA: DBのテーブルを自動作成してくれる機能
spring.jpa.hibernate.ddl-auto=update
spring.datasource.url
データベースへの接続URLです。ここではlocalhost:3306でMySQLに接続しています。データベース名はsample
としています。
spring.datasource.username
MySQLのユーザー名です。ここではrootを設定しています。
spring.datasource.password
MySQLのパスワードです。今回は特に設定していません。
spring.jpa.hibernate.ddl-auto=update
ddl-auto
をupdate
にすることで、1回作成したテーブルは再作成せず、存在しないテーブルだけEntityの定義に基づいて新規作成してくれます。
ディレクトリ構成と各レイヤーの役割
おおまかなディレクトリ構成は以下の通りです。
ここではWeb三層構造(アーキテクチャ)を意識した構成で実装したいと思います。
各レイヤーは独立した役割を持ち、下位レイヤーにのみ依存します。
com/example/demo
├── CrudSampleApplication.java // メインアプリケーションクラス
├── controller // コントローラー層
│ ├── form
│ │ └── CompanyForm.java // ユーザー入力用フォームオブジェクト
│ └── CompanyController.java // HTTP リクエストを処理
├── entity // モデル層 (エンティティ)
│ └── Company.java // 会社データを表すエンティティ
├── repository // リポジトリ層
│ └── CompanyRepository.java // データアクセスインターフェイス
└── service // サービス層
└── CompanyService.java // ビジネスロジック
メインアプリケーション(Main Application)
CrudSampleApplication.java
:
Spring Bootアプリケーションのエントリーポイントです。このクラスが実行されることで、アプリケーションが起動します。
コントローラー層 (プレゼンテーション層)
このレイヤーはユーザーやクライアントからのリクエストを受け取り、適切なサービスメソッドを呼び出してデータを取得します。ユーザーインターフェイスとサービス層の仲介役を果たします。
CompanyController.java
:
HTTPリクエストを処理し、対応するサービスメソッドを呼び出します。
CompanyForm.java
:
フォームデータを受け取るためのオブジェクトです。ユーザーから入力されたデータをバインドし、コントローラで扱いやすい形にします。
サービス層 (ビジネスロジック層)
ビジネスロジックを実装するレイヤーです。コントローラから呼び出され、リポジトリに対する適切なメソッドの呼び出しを行います。
CompanyService.java
:
データの作成や更新、削除などの操作を行います。リポジトリレイヤーと連携して実行します。
リポジトリ層 (データアクセス層)
データの永続化(データベースとのやり取り)を行います。このレイヤーがデータベースと通信し、データの取得や保存、更新、削除を担当します。このレイヤーは、ビジネスロジックを直接のデータベースアクセスから分離します。
CompanyRepository.java
:
Spring Data JPAを使って、データベースに対する操作を簡単に実施できるインターフェースです。
モデル層 (ドメイン層)
アプリケーションのデータ構造を表します。これらのクラスがデータベースのテーブルにマッピングされます。
Company.java
:
Company
テーブルを表すエンティティクラスです。テーブルの列に対応するフィールドを持ち、JPA (Java Persistence API) アノテーションでマッピングを定義しています。
視覚的なフロー
[ユーザー] <---> [コントローラー層] <---> [サービス層] <---> [リポジトリ層] <---> [データベース]
まとめると...
コントローラー層: HTTP リクエストとユーザーの操作を処理します。
サービス層: ビジネスロジックを含み、データを処理します。
リポジトリ層: データアクセスとデータベースとの対話を管理します。
モデル層: データの構造 (エンティティ) を定義します。
このようなレイヤード・アーキテクチャを採用することの利点は、各レイヤーが異なる責務を持つため、コードの再利用性が高まり、テストがしやすくなり、アプリケーションのメンテナンス性が向上することです。
例えば、ビジネスロジックの変更があった場合でも、サービス層のみを変更すれば済み、他のレイヤーには影響を及ぼさないことが期待できます。
さいごに
今回は事前準備と題し、環境要件から依存関係、ディレクトリ構成などCRUDアプリケーションを作成するために必要な作業や知識についてまとめました。
次回は新規登録画面の表示機能から作成していきます。