Pulog

Spring BootでSpring Data JPAを利用できるようになる

今回は、Spring BootでSpring Data JPAを利用できる環境を構築します。

環境

筆者は以下の環境で構築を進めていきます。
お手持ちのPCとの構成や使うIDEが違う場合、適宜読み替えていただけると幸いです。

  • OS Windows 10 Pro 64bit
  • JDK Amazon Corretto 11
  • IDE IntelliJ IDEA Community Editioin 2020.1.3

※ Java 8でも動作すると思われますが、基本的にJava 8はサポートが終了しているので、現行LTSバーションのJava 11を使用することをおすすめします。

Spring Bootの雛形を作成する

Springの公式サイトにて手軽にSpring Boot環境を作成できるように、プロジェクトの雛形を作成するツールが公開されているので、今回はそちらを利用していきます。

Spring Initializr

Spring Initializr

基本的にデフォルトのままでよいが、今回は以下の入力を変更しています。

  • Project
    • Maven ProjectGradle Project
  • Java
    • 811
  • Dependencies ※以下を選択肢から追加する
    • Spring Web 必須 Webサーバー(Tomcat)を提供してくれる
    • Spring Data JPA 必須 今回の要となるライブラリ
    • H2 Database DBサーバーを用意しない場合必須 組み込み型のDB
    • Lombok 今回は必須 モデルクラスの Getter / Setter を省略できるようになる

今回はDBサーバーの構築工程を省略できる組み込みDB H2 Database を採用しました。

DBとしてMySQLサーバーを利用する場合は、 H2 Database ではなく MySQL Driver をDependenciesに追加してください。

※MySQL Driverを用いる場合のDB接続方法は今回は省略します、本稿の内容と逸れてしまうためご了承ください。

一通りの入力を済ませたら左下の Generate を押下してzipファイルを適宜フォルダへ解凍してください。

Lombok は冗長となるGetterやSetterメソッドを省略することができるため、導入することをおすすめします。
また、以下で紹介するコードは Lombok を選択した前提での実装となっています。

IDEのセットアップ

IntelliJ IDEAを利用する場合、設定(File > Settings...)のPluginsからLombokプラグインをインストールして再起動してください。

PluginsからLombokをインストールしてIntelliJ IDEAを再起動

IDEでプロジェクトを開く

ダウンロードしたファイルの中にある build.gradle を選択して OK を押下するとプロジェクトとして開くかファイル単体として開くかを問われるので、 Open as Project を押下。

build.gradleを選択しOKを押下、続いてOpen as Projectを押下してエディタを開く

Open as Project を押下するとIDE側でSpring Bootで必要なライブラリを自動的にダウンロードしてくれるので、しばらく放置しましょう。

ステータスバーのローディング状態が終われば実際にSpring Bootが動作する状態となります。

IntelliJ IDEA標準レイアウトの場合、右サイドバーが隠れているので右端にある Gradle ボタンを押下してサイドバーを表示させます。

demo > Tasks > application > bootRun を実行すると、SpringアプリケーションとWebサーバーが立ち上がります。

GradleサイドバーからbootRunを実行します

立ち上がった状態にてブラウザで http://localhost:8080 にアクセスすると以下のようなエラーページが表示されると思います(正常な挙動です)。

また、停止ボタンを押してから再度 http://localhost:8080 へアクセスしようとしても、ページが表示されないことを確認できればOKです。

Spring BootのbootRunを実行し、ブラウザで表示を確認

設定ファイルのリネームとDB設定

src/main/resources/application.propertiesapplication.yml に変更し、DB情報を追記します。

spring:
  # データの保存手段にh2dbを用いて、格納先とDBのモードを指定する(今回はH2DBをMySQLのように振る舞わせる)
  datasource:
    url: jdbc:h2:./.data/h2/db;MODE=MySQL
  # Spring Bootを再起動してもデータを保持するようにする
  jpa:
    hibernate:
      ddl-auto: update

実装

ここから実際にサンプルを作っていきます。
今回は以下のようなファイル構成で実装を進めますが、適宜変更してもらって構いません。

src/main/java/com/example/demo/
├── DemoApplication.java
├── SampleController.java #新規作成
└── user/
    ├── User.java #新規作成
    ├── UserRepository.java #新規作成
    └── UserService.java #新規作成

Model(テーブル)の作成

今回は例としてユーザーテーブル用のModelクラスを作成します。

User.java

package com.example.demo.user;

import lombok.Data;

import javax.persistence.*;

@Entity
@Data
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    @Column(unique = true, nullable = false)
    private String userName;

    @Column(nullable = false)
    private String password;
    
    private String role;
}

ユーザー名とパスワード、権限の情報を持つテーブルを作成しました。

@Id がプライマリーキーの指定、 @GeneratedValue でinsertを実行する際にidをユニークな値を格納してくれます。

@Column で、カラムの情報を適宜セットしています。
userName は他のユーザー名と重複しないように unique 指定にしたり、 null にならないように等。

次にモデルクラスをベースにデータのやりとりを行う Repository を作成します。

Repositoryインターフェースの作成

UserRepository.java

package com.example.demo.user;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends JpaRepository<User, Integer> {
}

JpaRepository<User, Integer> でRepositoryインターフェースでデータのやり取りするModelクラスを指定しています。
Integer の指定は User モデルクラスの @Id で指定した型を指定してあげればOK。

Serviceクラスの作成

実際にはRepositoryインターフェースを作った時点で、データ新規作成・更新・データ取得・削除(CURD)はできるようになっているのですが、Userテーブルの保存と同時に他のテーブルにも更新をかけたり等、もう少し複雑な処理をする必要がある場合は Serviceクラスを作成してあげるのが望ましいです。

UserService.java

package com.example.demo.user;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.UUID;

@Service
public class UserService {
    // UserRepositoryを読み込む
    @Autowired
    UserRepository userRepository;

    /**
     * Userテーブルにある全データを出力する
     *
     * @return 全Userデータ
     */
    public List<User> findAll() {
        return userRepository.findAll();
    }

    /**
     * ユーザーを登録する
     *
     * @param user 登録したいユーザー名
     */
    public void registerUser(String user) {
        var model = new User();
        model.setUserName(user);
        // 実際にアプリケーションを公開し、パスワードを管理する際は暗号化などの対応必須
        // BCryptPasswordEncoderでの暗号化などを検討してください
        model.setPassword(UUID.randomUUID().toString());
        userRepository.save(model);
    }
}

Controllerの実装

データのやりとりをする処理は既に完成したので、実際に動作を確認するために適当なControllerクラスを作成していきます。

今回は一覧の取得とユーザーの作成のみ例として作成してみます。

SampleController.java

package com.example.demo;

import com.example.demo.user.User;
import com.example.demo.user.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.sql.SQLException;
import java.util.List;

@RestController
public class SampleController {
    @Autowired
    UserService userService;

    /**
     * ユーザー一覧取得
     *
     * @return userテーブルの一覧
     */
    @GetMapping("/user")
    public ResponseEntity<List<User>> index() {
        return ResponseEntity.ok(userService.findAll());
    }

    /**
     * ユーザー登録
     *
     * @param name userテーブルのuserNameカラムの値
     * @return 登録成功時 200 OK を出力, ユーザー名重複による登録失敗時 400
     */
    @RequestMapping("/user/create/{name}")
    public ResponseEntity create(
            @PathVariable("name") String name
    ) {
        userService.registerUser(name);
        return ResponseEntity.ok().body("OK");
    }
}

ここまで実装してからGradleのbootRunを実行し、 http://localhost:8080/user/create/適当な名前 を何度か繰り返しアクセスし、 http://localhost:8080/user へアクセスするとユーザー一覧が表示されるかと思います。

/user/create/適当な名前 でユーザー作成後に /user で一覧を表示した結果

※この表示はFirefoxで見ているため、データが整形されて表示されていますが、実際にSpring Bootからは以下のようなJSONが出力されています。

[{"id":1,"userName":"testUser1","password":"2c7e5a81-ccc0-426f-bc84-d5b53167a643","role":null},{"id":3,"userName":"testUser2","password":"052b0800-f540-462b-b429-bd2f7c7012de","role":null},{"id":226,"userName":"適当な名前","password":"e3536fd5-914c-429d-8de6-9c84dd8e117a","role":null}]

終わりに

これでSpring Data JPAの最低限の実装は作成できました。
今後、当ブログでSprind Data JPA関連の記事を当記事をベースに横展開していく予定です、

実際に上記の記事で実装した内容は以下にて保管していますので、そちらも参照いただければと思います。

https://git.pu10g.com/root/spring_jpa_example/tree/node/17

参考になれば幸いです。

それでは。