DB を無料で使えるサービス Supabase を使って SpringBoot から接続したときの簡易メモ
Supabase は認証とかもあって使い道がいろいろとありそう
一旦は PostgreSQL を無料で使えるくらいでやってます
大雑把な流れ
- Supabase にプロジェクト作成・テーブル作成
- SpringBoot のプロジェクト作成・DB接続情報定義・モジュール作成
実行環境
- Windows11
- Pleiades 2024 Full Edition
- Maven v3.9.6
- SpringFramework Boot v3.4.4
- Java v21
- spring-boot-starter-data-jdbc
- spring-boot-starter-data-jpa
- PostgreSQL Driver
Supabase にプロジェクト作成・テーブル作成
基本は流れに身を任せて進めれば作れると思います
参考程度にイメージはって手順のせてます
後続のデータ取得でつくる Entity, Repository はここで作ってるテーブルの設定でつくります
Supabasee プロジェクト作成
- Supabasee のサイトにアクセス
https://supabase.com/ - Start your project でアカウント作成に進む
- アカウントをつくる(イメージは Github でつくるとき)
- 各種の設定は初期設定でOK (料金 free じゃなかったら free にした方が安全)
- プロジェクト作成(とりあえず blank)
- プロジェクト名、リージョン(日本にする)、パスワード入力(覚えておく)
Supabasee テーブル作成
- Table Editor 選んで Create a new table を押す
- 以下の設定でテーブル作成
- テーブルのRLSポリシーを追加 (Add RLS policy)
ここでは全部、許可の設定(要件に合わせてやった方が良いです)
SpringBoot のプロジェクト作成・DB接続定義・モジュール作成
最低限の設定だけつけてDBの情報をコンソールログにとりあえずだすまでやってみる
SpringBoot プロジェクト作成
- SpringBoot の新規プロジェクトを作成する
以下のところが気にするところ、それ以外はデフォルトでOK- タイプ:Maven
- Javaバージョン:21
- 依存関係:Spring Data JDBC, Spring Data JPA, PostgreSQL Driver をチェック(他はデフォルトのチェック残す)
SpringBoot DB接続定義
-
application.properties に以下を追加
- url : これは supabase より取得する URI (取得方法ちょっとしたを参照)
- pool : とりあえず最小の設定(デフォルトだと何回か再起動でエラーになる)
application.propertiesspring.datasource.driver-class-name=org.postgresql.Driver spring.datasource.url=jdbc:postgresql://xxxxxxx.suapbase.com:6543/postgres?user=xxxxxxx&password=[YOUR-PASSWORD] spring.datasource.hikari.maximum-pool-size=1 spring.datasource.hikari.minimum-idle=1 spring.datasource.hikari.connection-timeout=30000 spring.datasource.hikari.idle-timeout=300000 spring.datasource.hikari.max-lifetime=1800000 spring.datasource.hikari.leak-detection-threshold=5000 spring.datasource.hikari.pool-name=SupabaseHikariPool spring.datasource.hikari.connection-test-query=SELECT 1 spring.jpa.hibernate.ddl-auto=none spring.jpa.show-sql=true spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
SpringBoot モジュール作成
- Entity
Wktable.java
package com.example.demo; import java.util.Date; import org.hibernate.annotations.CreationTimestamp; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import lombok.Data; @Data @Entity public class Wktable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @CreationTimestamp private Date createdAt; private String message; }
- Repository
WktableRepository.java
package com.example.demo; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @Repository public interface ChatRepository extends JpaRepository<Chat, Long> { }
- Controller
GetDbController.java
package com.example.demo; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class GetDbController { @Autowired WktableRepository wktableRepository; @GetMapping("/getdb") public List<Wktable> getdb() { List<Wktable> wktables = wktableRepository.findAll(); wktables.forEach(wktable -> { System.out.println(wktable.getId()); System.out.println(wktable.getCreatedAt()); System.out.println(wktable.getMessage()); }); return wktables; } }