ユーザー情報をデータベースに保存する方法とは?Springのエンティティクラスを使った基本解説
新人
「先輩、ユーザー情報ってどうしてデータベースに保存するんですか?」
先輩
「アプリでログインや会員登録を実現するには、ユーザーの名前やパスワードなどの情報をどこかに保持しておく必要があります。その保存先がデータベースなんだ。」
新人
「なるほど。じゃあ、その情報を保存するにはどうすれば良いんですか?」
先輩
「Springでは、エンティティクラスを使ってユーザー情報をデータベースに保存する準備をするんだ。具体的には、@Entityアノテーションを使ってUserクラスを作るよ。」
新人
「@Entityって何ですか?」
先輩
「@Entityは、このクラスがデータベースのテーブルとして扱われることを示すアノテーションだよ。では、順番に解説していこうか。」
1. なぜユーザー情報をデータベースに保存するのか(認証との関係)
Webアプリケーションにおいて「ユーザー情報をデータベースに保存」する理由は、ログインや会員登録などの「認証処理」を正しく行うためです。たとえば、メールアドレスとパスワードでログインする機能を作るとき、入力された情報が正しいかどうかを確認する必要があります。
その確認には、あらかじめ保存されたユーザー情報が必要です。Springでは、データベースに保存されたユーザー情報をもとにして、ログイン時に入力された情報と照合を行います。照合する情報には、ユーザー名、パスワード、メールアドレス、権限情報などが含まれます。
このように、ユーザーの情報は一時的なものではなく、アプリケーションの動作において重要なデータです。そのため、永続的に保存されるデータベースに登録する必要があります。Springフレームワークでは、ユーザー情報を管理するためのエンティティクラスを作成し、それを使ってデータベースとのやり取りを実現します。
2. エンティティクラス(Userクラス)の作成と意味
Springで「ユーザー情報をデータベースに保存」するには、まず「Userエンティティクラス」を作成します。このクラスは、データベースの「users」テーブルと連動するように設計されます。エンティティとは、簡単に言うと「データベースのテーブルに対応するJavaのクラス」のことです。
エンティティクラスには、ユーザーの名前、メールアドレス、パスワードなどの情報をプロパティとして定義します。そして、@Entityというアノテーションを付けることで、「このクラスはエンティティです」とSpringに伝えます。
以下は、基本的なUserエンティティクラスの例です。
package com.example.demo.entity;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String username;
private String email;
private String password;
// GetterとSetterは省略可(Lombokを使わない場合は記述)
}
このUserクラスには、次のような意味があります:
- @Entity:このクラスがエンティティであることを示します。
- @Id:主キー(Primary Key)となるフィールドに付けます。
- @GeneratedValue:IDを自動採番にする指定です。
- username, email, password:それぞれ、ユーザーの名前、メールアドレス、パスワードの情報を保持します。
このように、Springではエンティティクラスを通じてユーザー情報を構造的に表現し、それをデータベースのテーブルと紐づけることで、「データベースに保存」する仕組みを構築します。
このUserクラスは、のちにSpring Data JPAのリポジトリインターフェースと組み合わせることで、ユーザー情報の登録・取得・更新・削除といった基本操作が簡単に行えるようになります。
3. Spring Data JPAを使ったリポジトリインターフェースの作成
次に、「ユーザー情報をデータベースに保存」するために必要なリポジトリインターフェースを作成します。Springでは、データベース操作を行うために@Repositoryアノテーションを使ったクラスやインターフェースを用意します。
しかし、Spring Data JPAを利用することで、データベース操作に必要な処理の多くを自動で行ってくれます。開発者はインターフェースを定義するだけで、ユーザー登録や検索、削除といった基本的な処理を簡単に実装できます。
このリポジトリインターフェースには、エンティティクラスと主キーの型を指定するだけです。以下のコードは、Userエンティティに対応したリポジトリの例です。
package com.example.demo.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import com.example.demo.entity.User;
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}
このコードの中で重要なポイントを見ていきましょう。
- @Repository:このインターフェースがリポジトリであることを示します。
- JpaRepository:Spring Data JPAが提供するインターフェースで、データベース操作の基本機能(保存・検索・削除など)を備えています。
- User, Long:対象のエンティティクラス(User)と主キーの型(Long)を指定しています。
このように、Spring Data JPAのリポジトリを作ることで、ユーザー情報を保存する処理がとても簡単になります。
4. ユーザー情報を登録するためのコントローラの作成(@Controller)
次に、@Controllerを使って、フォームから送信されたユーザー情報をデータベースに保存する処理を実装します。
コントローラは、Web画面とサーバー側の処理をつなぐ役割を持つクラスです。Springでは、@Controllerアノテーションを使ってクラスをコントローラとして指定し、ユーザーが送信したデータを受け取り、リポジトリを通じて保存する流れを作ります。
以下は、簡単なユーザー登録用のコントローラクラスの例です。
package com.example.demo.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import com.example.demo.entity.User;
import com.example.demo.repository.UserRepository;
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private UserRepository userRepository;
@PostMapping("/register")
public String registerUser(@ModelAttribute User user) {
userRepository.save(user);
return "redirect:/user/success";
}
}
このコントローラでは、次のようなポイントをおさえています。
- @Controller:このクラスがSpring MVCのコントローラであることを示します。
- @RequestMapping:URLのプレフィックス(/user)を定義します。
- @PostMapping("/register"):
/user/registerにPOSTでリクエストが来たときの処理を定義します。 - @ModelAttribute User user:フォームから送信されたユーザー情報をUserオブジェクトに自動的にバインドします。
- userRepository.save(user):ユーザー情報をデータベースに保存します。
- redirect:/user/success:登録成功後に別ページへリダイレクトします。
このように、@Controllerを使ってユーザー登録の処理を受け取り、リポジトリを通じてユーザー情報をデータベースに保存することで、アプリケーションに必要な基本機能を実現することができます。
なお、この例ではビューとしてHTMLファイルを用いる構成を想定しています。@RestControllerを使う方法もありますが、今回の開発環境では@Controllerを使用する前提なので注意しましょう。
また、データバインドや入力チェックを行いたい場合には、@ValidやBindingResultなどを併用して、バリデーション処理を追加することも可能です。
5. 登録フォームのHTML作成と@ModelAttributeの使い方
それでは、実際に画面からユーザー情報を入力するためのHTMLフォームを作成してみましょう。Spring MVCでは、@ModelAttributeを使ってフォームから送信された値をJavaオブジェクトにバインドします。
フォームの画面では、th:objectを使って、Userオブジェクトと紐づけた状態で入力項目を用意します。以下は、Thymeleafを使用したユーザー登録フォームの例です。
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>ユーザー登録フォーム</title>
</head>
<body>
<h2>ユーザー登録</h2>
<form th:action="@{/user/register}" th:object="${user}" method="post">
<label for="username">ユーザー名:</label>
<input type="text" id="username" th:field="*{username}" /><br><br>
<label for="email">メールアドレス:</label>
<input type="email" id="email" th:field="*{email}" /><br><br>
<label for="password">パスワード:</label>
<input type="password" id="password" th:field="*{password}" /><br><br>
<button type="submit">登録</button>
</form>
</body>
</html>
このフォームのポイントを整理してみましょう。
- th:object="${user}":コントローラから渡された
Userオブジェクトをフォームと関連づけます。 - th:field="*{プロパティ名}":Userオブジェクトの各プロパティとフォームの入力値を自動的にバインドします。
- th:action="@{/user/register}":フォームの送信先URLを指定します。
このように、Spring MVCでは@ModelAttributeを利用することで、フォームからユーザー登録を簡単に行うことができます。
実際の画面では、入力された値がUserクラスのプロパティに対応して保存され、そのままコントローラに渡される仕組みになっています。
6. ユーザー情報を画面から入力して保存する流れ(フォーム送信→Controller→Repository)
ここまでで、エンティティ、リポジトリ、コントローラ、HTMLフォームがそろいました。最後に、ユーザー情報を保存する一連の流れを整理してみましょう。
ユーザーがWeb画面から情報を入力し、「登録」ボタンを押すと、以下の順で処理が進みます。
- HTMLフォームで入力されたユーザー名、メールアドレス、パスワードなどのデータがサーバーに送信される。
- @Controllerで受け取ったデータは、
@ModelAttributeを通じてUserオブジェクトに変換される。 UserRepositoryのsave()メソッドを使って、データベースにUser情報が保存される。- 保存が成功すると、
redirect:で指定されたURLにリダイレクトされ、完了画面などが表示される。
実際の処理の流れをもう一度、関連するコードで見てみましょう。
ユーザー情報の入力(フォーム)
<form th:action="@{/user/register}" th:object="${user}" method="post">
<input type="text" th:field="*{username}" />
<input type="email" th:field="*{email}" />
<input type="password" th:field="*{password}" />
<button type="submit">登録</button>
</form>
ユーザー情報の受け取りと保存(コントローラ)
@PostMapping("/register")
public String registerUser(@ModelAttribute User user) {
userRepository.save(user);
return "redirect:/user/success";
}
ユーザー情報の保存(リポジトリ)
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}
このように、Spring MVC フォームを使った入力から、@ModelAttributeによるデータの受け取り、そしてSpring Data JPAのsave()メソッドによる保存処理まで、流れがとても自然に構成されています。
フォームに入力した内容がそのままUserクラスに変換され、ユーザー情報をデータベースに保存できる仕組みは、Springの大きな魅力のひとつです。
また、今回紹介した仕組みは、フォームからユーザー登録を行う基本構成として非常に重要な部分なので、今後ログイン処理やバリデーションなどに進む際の土台になります。