Spring Data JPAに感動した話
Javaの学習を始めたばかりの頃、私はJDBCからDBアクセスを勉強し始めました。
その時のコードがこちらです。
// 昔、私が書いていたSQL直書きのイメージ
public void addTodo(String title, String description, boolean status) {
// 毎回SQLを文字列で記述...
String query = "INSERT INTO todos (title, description, status) VALUES(?, ?, ?)";
jdbcTemplate.update(query, title, description, status);
}
テーブルのスキーマが変わるたびにこのSQLを直したり、クエリミスがないか確認したり、結構大変ですよね。
そんな私がSpring Data JPAに出会ったときは、本当に感動しました!「こんなに簡単にDBにアクセスできるの!?」と。複雑でない基本的なロジックだけなら、JPAを使うと本当に楽になります。
もし、まだJPAを使ったことがない方がいたら、基本のCRUD操作(作成、読み取り、更新、削除)だけであれば、ぜひ使ってみてください。
- JPAが実現する「宣言的なDBアクセス」
Spring Data JPAの世界では、具体的なSQL(INSERT INTO...)を書く代わりに、リポジトリのインターフェースを定義するだけでOKです。
まずは、あなたのエンティティ(Activity)に対応するリポジトリインターフェースを定義します。
import org.springframework.data.jpa.repository.JpaRepository;
// @Repositoryを忘れずに
public interface ActivityRepository extends JpaRepository<Activity, Long> {
// ここは空でOK!
// 補足ですが、Activityエンティティと、その主キーの型(Long)を指定しています
}
このたった一行で、データの保存、検索、更新、削除の基本機能(save(), findById(), delete()など)が自動的に使えるようになります。
2. リポジトリを呼び出してデータを保存する
このActivityRepositoryをService層で利用することで、データ保存は以下のように非常にシンプルになります。
Service層でのコードイメージは以下の通りです。
@Service
public class ActivityService {
// Springに「このリポジトリを使ってね」と伝える
private final ActivityRepository activityRepository;
public ActivityService(ActivityRepository activityRepository) {
this.activityRepository = activityRepository;
}
public Activity createActivity(Activity newActivity) {
// 見てください!SQLはどこにもありません!
// JpaRepositoryが提供する save() メソッドを呼び出すだけ。
return activityRepository.save(newActivity);
}
}
activityRepository.save(newActivity)を実行するだけで、Spring Data JPAが裏側で、あなたのエンティティ定義に基づいた適切なINSERT SQLを自動生成・実行してくれます。
つまり、私たちは**「何をしたいか (saveしたい)」というビジネスロジックに集中でき、「どうやるか (具体的なSQL)」**という面倒な作業から解放されるのです。
3. JPAとJDBCの使い分け(補足)
もちろん、大規模開発や高度な要件ではJDBCを使う場面もあります。
技術 優先する目的
Spring Data JPA 開発スピードとメンテナンスの容易さを優先する、標準的なCRUD操作。
JDBC (jdbcTemplateなど) パフォーマンスを最優先する、複雑な一括処理やSQLのチューニングが必要な場合。
ですが、学習を始めたばかりの段階では、JPAはほとんどのWebアプリケーションで十分通用します。
Discussion