カテゴリ: Spring 更新日: 2026/02/05

Springの例外処理を完全ガイド!初心者でもわかるDataAccessExceptionの仕組みと使い方

DataAccessException体系:JPA/JDBCの例外変換とリカバリ戦略
DataAccessException体系:JPA/JDBCの例外変換とリカバリ戦略

先生と生徒の会話形式で理解しよう

生徒

「Spring Bootを使っていて、データベースのエラーをどう扱えばいいか迷っています。どうすればいいですか?」

先生

「Springには、データベース操作時の例外を一元的に扱えるDataAccessExceptionという仕組みがありますよ。」

生徒

「聞いたことありますが、JPAやJDBCとどう関係しているんですか?」

先生

「いい質問ですね。それでは、DataAccessException体系とJPA/JDBCの例外変換、そしてリカバリ戦略について詳しく解説しましょう!」

1. Springの例外処理はなぜ重要なのか?

1. Springの例外処理はなぜ重要なのか?
1. Springの例外処理はなぜ重要なのか?

Spring FrameworkやSpring Bootでデータベースにアクセスする際、例外が発生することは珍しくありません。SQLの構文ミス、ネットワーク障害、トランザクションの問題など、様々な原因が考えられます。これらを適切にハンドリングしないと、アプリケーションが予期せぬ動作をしたり、ユーザーに不親切なエラーメッセージが表示されたりしてしまいます。そこで登場するのが、SpringのDataAccessException体系です。

2. DataAccessExceptionとは何か?

2. <code>DataAccessException</code>とは何か?
2. DataAccessExceptionとは何か?

DataAccessExceptionは、Springが提供する共通のデータアクセス例外のスーパークラスです。JDBCやJPA、MyBatisなど、異なる実装レベルで発生した例外をラップして、共通の形式で扱えるようにするためのものです。これにより、データアクセス技術ごとの異なる例外型に依存せず、ビジネスロジック層ではDataAccessExceptionだけを扱えばよくなります。

3. Springの例外変換機能:JDBCやJPAの例外をどう変換する?

3. Springの例外変換機能:JDBCやJPAの例外をどう変換する?
3. Springの例外変換機能:JDBCやJPAの例外をどう変換する?

Springは、JDBCやJPAから発生したチェック例外やランタイム例外をDataAccessExceptionに自動で変換する仕組みを備えています。たとえば、JDBCでSQL構文エラーが発生した場合は、BadSqlGrammarExceptionというサブクラスに変換されます。

これは、例外変換機構(Exception Translation)と呼ばれ、主に以下の2つの仕組みで実現されます。

  • JdbcTemplate:JDBCの例外を変換
  • @Repository:AOPを使ってJPAの例外を変換

Springはこれにより、JPAのjavax.persistence.PersistenceExceptionなどをDataAccessExceptionに変換し、アプリケーションで一貫した例外処理が可能になります。

4. 主なDataAccessExceptionの種類

4. 主な<code>DataAccessException</code>の種類
4. 主なDataAccessExceptionの種類

DataAccessExceptionには多くのサブクラスがあります。それぞれの目的に応じて、以下のような分類がされています。

  • BadSqlGrammarException:SQL文が間違っている場合
  • DuplicateKeyException:ユニーク制約違反
  • DataIntegrityViolationException:データ整合性エラー
  • EmptyResultDataAccessException:期待するデータが取得できなかった場合
  • TransientDataAccessResourceException:一時的な接続障害

これらを使い分けることで、原因に応じたエラーメッセージやリトライ処理などの対応がしやすくなります。

5. @Repositoryアノテーションによる例外変換

5. <code>@Repository</code>アノテーションによる例外変換
5. @Repositoryアノテーションによる例外変換

Springでは、クラスに@Repositoryアノテーションを付けることで、自動的に例外がDataAccessExceptionに変換されるようになります。これは、AOP(アスペクト指向プログラミング)によって実現されており、PersistenceExceptionなどのJPA固有の例外をSpringがキャッチして変換します。


@Repository
public class UserRepository {
    @PersistenceContext
    private EntityManager em;

    public User findUser(Long id) {
        return em.find(User.class, id);
    }
}

6. JDBC利用時の例外変換:JdbcTemplateの活用

6. JDBC利用時の例外変換:<code>JdbcTemplate</code>の活用
6. JDBC利用時の例外変換:JdbcTemplateの活用

SpringでJDBCを扱う場合は、JdbcTemplateを使用するのが一般的です。このクラスは、SQLExceptionをラップしてDataAccessExceptionに変換してくれます。


@Autowired
private JdbcTemplate jdbcTemplate;

public int countUsers() {
    return jdbcTemplate.queryForObject("SELECT COUNT(*) FROM users", Integer.class);
}

7. 例外ハンドリングのベストプラクティスとリカバリ戦略

7. 例外ハンドリングのベストプラクティスとリカバリ戦略
7. 例外ハンドリングのベストプラクティスとリカバリ戦略

Springで例外処理を行う際には、ただログに出力して終了ではなく、リカバリ(回復)戦略を意識することが重要です。たとえば以下のような対応が考えられます。

  • データ整合性違反:入力内容を見直すようユーザーに案内
  • 接続エラー:リトライ処理を実装して一時的な障害に備える
  • 検索結果なし:ユーザーに「データが見つかりません」と表示

また、コントローラー層では@ExceptionHandler@ControllerAdviceを使って、アプリケーション全体で共通のエラーレスポンスを返す設計もよく使われます。

8. @ExceptionHandlerDataAccessExceptionをハンドリング

8. <code>@ExceptionHandler</code>で<code>DataAccessException</code>をハンドリング
8. @ExceptionHandlerDataAccessExceptionをハンドリング

Spring MVCでは、@ExceptionHandlerを使ってDataAccessExceptionを個別に処理できます。これにより、DBエラー専用のエラーページやJSONレスポンスを返すことが可能です。


@RestController
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/users/{id}")
    public User getUser(@PathVariable Long id) {
        return userService.findById(id);
    }

    @ExceptionHandler(DataAccessException.class)
    public ResponseEntity<String> handleDatabaseError(DataAccessException ex) {
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
            .body("データベースエラーが発生しました");
    }
}

9. 実運用で気をつけたいポイント

9. 実運用で気をつけたいポイント
9. 実運用で気をつけたいポイント

実際のプロジェクトでは、DataAccessExceptionの詳細な種類をログに出力しておくことが重要です。これにより、トラブルシューティングの精度が高まり、根本原因の特定が容易になります。また、予期しない例外にも対応できるように、Exception全体をキャッチするバックアップのハンドラも用意しておくと安心です。

Springの学習を効率化したい方へ

この記事の内容をもっと深く知るには、以下の入門書が最適です。

Spring Framework超入門をAmazonで見る
カテゴリの一覧へ
新着記事
New1
Spring
SpringDataJPAのJPAクエリメソッド「EndingWith」の使い方を完全ガイド!初心者向け解説
更新記事
New2
Spring
SpringDataJPAのJPAクエリメソッド「StartingWith」の使い方を完全ガイド!初心者向け解説
更新記事
New3
Spring
SpringDataJPAのJPAクエリメソッド「NotLike」の使い方を完全ガイド!初心者向け解説
更新記事
New4
Spring
SpringDataJPAのJPAクエリメソッド「Like」の使い方を完全ガイド!初心者向け解説
更新記事
人気記事
No.1
Java&Spring記事人気No1
Spring
Spring BootとJavaの互換性一覧!3.5/3.4/3.3はJava 21・17に対応してる?
No.2
Java&Spring記事人気No2
Java
JavaのBooleanクラスの使い方を完全ガイド!初心者でもわかる真偽値の操作
No.3
Java&Spring記事人気No3
Java
JavaのIOExceptionクラス徹底解説!初心者向けファイル入出力エラー対策ガイド
No.4
Java&Spring記事人気No4
JSP
JSPの基本タグ一覧と使い方まとめ!実務で使えるタグを紹介
No.5
Java&Spring記事人気No5
JSP
JSPでif文・for文を使う方法!初心者でもわかるJavaとの違いと使い方
No.6
Java&Spring記事人気No6
Spring
SpringのBindingResultを完全ガイド!初心者でもわかる入力チェックとエラー処理
No.7
Java&Spring記事人気No7
Spring
SpringのModelクラスとaddAttributeメソッドの使い方を完全ガイド!初心者でも安心
No.8
Java&Spring記事人気No8
Spring
SpringDataJPAのJPAクエリメソッド「EndingWith」の使い方を完全ガイド!初心者向け解説