Spring

[Spring] 스프링 데이터베이스(2) - 익셉션 처리

재담 2022. 4. 18. 00:17

스프링 익셉션 처리

JDBC 프로그래밍을 할 때 데이터베이스 처리 과정에서 발생하는 에러는 항상 SQLException이다. 예를 들어 다음 코드를 보자.

try {
    conn = getConnection();
    stmt = conn.createStatement();
    rs = stmt.executeQuery("select * from guestbook_message");
    
    // 이하 생략
    ...
} catch (SQLException ex) {
    // 익셉션 처리
}

위 코드에서 SQLException을 캐치하는 코드는 Connection을 구하는 과정에서 익셉션이 발생했는지, Statement를 생성하는 과정에서 익셉션이 발생했는지, 아니면 SQL 쿼리를 실행하는 과정에서 익셉션이 발생했는지 바로 알 수 없다.

 

스프링은 데이터베이스 처리 과정에서 발생한 익셉션이 왜 발생했는지를 구체적으로 확인할 수 있도록, 데이터베이스 처리와 관련된 익셉션 클래스를 제공하고 있다. 예를 들어 OptimisticLockingFailureException이나 DataRetrievalFailureException과 같이 실패 원인을 보다 구체적으로 설명해주는 익셉션 클래스를 제공하고 있다.

 

JdbcTemplate 클래스는 DB 연동 과정에서 SQLException이 발생하면 스프링이 제공하는 익셉션 클래스 중 알맞은 익셉션 클래스로 변환해서 발생시킨다. 예를 들어 아래 코드와 같이 올바르지 않은 SQL 쿼리를 실행하는 경우 BadSqlGrammarException을 발생시킨다.

List<Message> list = jdbcTemplate.query(
    "select * from guestbook_message order by guestbook_message_id desc " +
    "limited ?, ?", // MySQL 쿼리 오류
    // 이하 생략
    ...
    );

 

스프링이 제공하는 데이터베이스 관련 익셉션 클래스들은 모두 DataAccessException 클래스를 상속받고 있는데, DataAccessException은 RuntimeException이다. 따라서, 필요한 경우에만 try-catch 블록을 이용해서 익셉션을 처리하면 된다.

 

JdbcTemplate 뿐만 아니라 JPA, 하이버네이트, MyBatis를 위한 지원 기능은 내부적으로 발생하는 익셉션 클래스를 스프링이 제공하는 익셉션 클래스로 알맞게 변환한 익셉션을 발생시킨다. 따라서 스프링이 제공하는 기능을 사용하면 데이터베이스 연동 기술에 상관없이 동일한 익셉션 타입을 이용해서 에러를 처리할 수 있게 된다.


Reference

  • 웹 개발자를 위한 Spring 4.0 프로그래밍 (최범균 저)