Spring Data REST API(PostgreSQL)を作成する方法をご紹介します。
条件
- Spring Tool Suite 4
- Spring Boot 2.5.0
- PostgreSQL 13.3
- gradle
事前準備
データベース作成
まずは、PostgreSQLにデータベースおよびテーブルを作成します。
以下のコマンドを実行します。
# create database testdb;
作成したデータベースへ切り替え
以下のコマンドで、作成したデータベースに切り替えます。
# \c testdb
テーブル作成
例として以下のようなテーブルを作成します。
create table weather ( id serial primary key, -- ID location_id int, -- 地名ID name varchar(20), -- 地名 temperature int, -- 気温 humidity int, -- 湿度 date_time timestamp -- 日時 );
データ追加
テーブルにデータを追加します。
insert into weather (location_id, name, temperature, humidity, date_time) values (1, '東京', 15, 55, '2019-04-10 09:00:00'), (1, '東京', 16, 53, '2019-04-10 10:00:00'), (1, '東京', 17, 40, '2019-04-10 11:00:00'), (2, '那覇', 20, 65, '2019-04-10 09:00:00'), (2, '那覇', 22, 67, '2019-04-10 10:00:00'), (2, '那覇', 25, 69, '2019-04-10 11:00:00');
プロジェクトの作成
STSのパッケージエクスプローラーで、右クリック > 新規 > Spring スターター・プロジェクトを選択します。
名前に適当な値(ここではrestJpa)を入力し、次へボタンを押します。
プロジェクトの依存関係で、以下を選択して完了ボタンを押します。
- Spring Data JPA
- PostgreSQL Driver
- Rest Repositories
ソース/設定ファイル等
設定ファイルの記述
application.properties
以下の内容を記述します。
(自分の環境に合わせて適宜修正してください)
spring.jpa.database=POSTGRESQL spring.datasource.url=jdbc:postgresql://localhost:5432/testdb spring.datasource.username=postgres spring.datasource.password=password spring.jpa.open-in-view=True
ソースの追加
Weather.java
DBに定義した内容を記述します。
package com.example.demo.entity; import java.sql.Timestamp; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @Entity public class Weather { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private Integer id; private Integer location_id; private String name; private Integer temperature; private Integer humidity; private Timestamp date_time; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Integer getLocation_id() { return location_id; } public void setLocation_id(Integer location_id) { this.location_id = location_id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getTemperature() { return temperature; } public void setTemperature(Integer temperature) { this.temperature = temperature; } public Integer getHumidity() { return humidity; } public void setHumidity(Integer humidity) { this.humidity = humidity; } public Timestamp getDate_time() { return date_time; } public void setDate_time(Timestamp date_time) { this.date_time = date_time; } }
WeatherRepository.java
インターフェースのみを定義します。
package com.example.demo.repository; import org.springframework.data.rest.core.annotation.RepositoryRestResource; import org.springframework.data.repository.PagingAndSortingRepository; import com.example.demo.entity.Weather; @RepositoryRestResource(collectionResourceRel = "weathers", path = "weathers") public interface WeatherRepository extends PagingAndSortingRepository<Weather, Integer>{ }
パッケージ構成
今回は以下のようなパッケージ構成としました。
実行
プロジェクトを右クリック > 実行 > Spring Bootアプリケーション を選択して実行します。
データ一覧の取得
以下のURLにブラウザでアクセスします。
http://localhost:8080/weathers
データ1件の取得
以下のようにIDを指定したURLにブラウザでします。
http://localhost:8080/weathers/2
データの追加
Postmanを使用してPOSTします。
URLは以下の値を設定します。
http://localhost:8080/weathers
Headersに以下を設定します。
- KEY: Content-Type
- VALUE: application/json
BODYに以下を設定します。
ラジオボタンでrawを選択し、プルダウンでJSONが選択されていることを確認してください。
{ "location_id" : 3, "name" : "横浜", "temperature" : 18, "humidity" : 77, "date_time" : "2021-06-10T11:11:11.000+00:00" }
Sendボタンを押すと、POSTが実行されます。
成功すると「201 Created」となり以下のような表示となります。
ブラウザでデータ一覧を確認すると、新しくデータが追加されていることがわかります。
データの更新
Postmanを使用してPUTします。
IDは「7」としてレコードが作成されたので、URLは以下の値とします。
http://localhost:8080/weathers/7
HeadersはPOSTの時と同じです。
BODYに以下を設定します。
{ "location_id" : 3, "name" : "横浜update", "temperature" : 23, "humidity" : 88, "date_time" : "2021-06-15T11:11:11.000+00:00" }
Sendボタンを押すと、PUTが実行されます。
成功すると「200 OK」となり以下のような表示となります。
ブラウザでデータ一覧を確認すると、対象データが更新されていることがわかります。
データの削除
Postmanを使用してDELETEします。
IDは「7」のレコードが対象なので、URLは以下の値とします。
http://localhost:8080/weathers/7
HeadersやBodyに設定は不要です。
Sendボタンを押すと、DELETEが実行されます。
成功すると「204 No Content」となり以下のような表示となります。
ブラウザでデータ一覧を確認すると、対象データが削除されていることがわかります。
以上で、Rest APIを用いたCRUDが出来ることを確認することが出来ました。
Lombokの導入
Lombokを用いて、ソースをすっきりさせたいと思います。
Lombokとは?
アノテーションを付加することで、getter/setter、toString、コンストラクタなどを自動生成してくれるライブラリです。
依存関係の追加
build.gradleのdependenciesに以下を追記します。
- compileOnly ‘org.projectlombok:lombok’
- annotationProcessor ‘org.projectlombok:lombok’
build.gradle
以下のようになりました。
plugins { id 'org.springframework.boot' version '2.5.0' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'java' } group = 'com.example' version = '0.0.1-SNAPSHOT' sourceCompatibility = '11' repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-data-rest' runtimeOnly 'org.postgresql:postgresql' testImplementation 'org.springframework.boot:spring-boot-starter-test' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' } test { useJUnitPlatform() }
依存関係の更新
build.gradleを右クリック > Gradle > Gradleプロジェクトのリフレッシュを選択すると、依存関係が更新されます。
LombokのIDE連携
Lombokのjarダウンロード
以下のサイトからjarをダウンロードします。
https://projectlombok.org/download
Lombokのインストール
ダウンロードしたjarをコマンドプロンプトにおいて、以下のコマンドで実行します。
java -jar lombok.jar
するとインストーラが起動します。
インストール対象のSTSが選択されていることを確認し、Install/Updateボタンを押します。
Install successfulという表示になったら、Quit Installerボタンを押して終了します。
インストールの確認
jar
SprintToolSuite4.exeのフォルダ内に以下のjarが追加されています。
- lombok.jar
iniファイル
SprintToolSuite4.iniに以下のような記述が追加されています。
- -javaagent:D:\sts-4.10.0.RELEASE\lombok.jar
動作確認
STSを再起動します。
ソース変更
Weather.java
- @Dataアノテーションを追加します。
- 作成済みのgetter/setterを削除します。
package com.example.demo.entity; import java.sql.Timestamp; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import lombok.Data; @Data @Entity public class Weather { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private Integer id; private Integer location_id; private String name; private Integer temperature; private Integer humidity; private Timestamp date_time; }
Ctrol + Oを押して、アウトラインを表示します。
以下が自動で生成されていることがわかります。
- getter/setterメソッド
- equals/ hashCodeメソッド
- toStringメソッド
- デフォルトコンストラクタ
Rest APIとしての動作も問題ありません。
参考
Sprint:Spring Data REST API の自動生成 (JPA)
https://spring.pleiades.io/guides/gs/accessing-data-rest/
Qiita:Spring JPA Data with REST と Lombokで恐ろしく簡単にREST APIを作成する。
https://qiita.com/ukiuni@github/items/fb46680146c4cc8b5187
ボイラープレートコードの排除(Lombok)
https://terasolunaorg.github.io/guideline/5.1.0.RELEASE/ja/Appendix/Lombok.html