템플릿 게시물에서는 UserDao 의 변경되지 않을 로직들 (예외처리, DataSource 로 부터 Connection 얻는 것, PreparedStatement 사용 등)을 템플릿/콜백 패턴을 이용하여 JdbcContext 클래스로 분리하는 작업을 진행하였습니다.

그리고 JdbcContext를 스프링에서 제공하는 JdbcTemplate로 대체하는 작업도 진행하였는데, 하나 의문점이 있었습니다.

jdbcContext를 사용했을 때와 달리 JdbcTemplate 을 사용했을 때는 예외를 throws 하는 구문이 없어졌습니다.

// jdbcContext를 사용했을 때
public void deleteById(String id) throws SQLException {
    jdbcContext.executeUpdateQuery("delete from User where id = ?", id);
}

// jdbcTemplate을 사용했을 때
public void deleteById(String id) {
    jdbcTemplate.update("delete from User where id = ?", id);
}

그 이유에 대해 이번 게시물에서 알아보도록 하겠습니다.

그 전에 예외에는 어떤 것이 있고, 처리하는 방법들은 어떤 것들이 있는지부터 살펴보겠습니다.

예외 종류


예외의 종류에는 다음과 같이 크게 3가지가 있습니다.

Error

java.lang.Error 클래스의 하위 클래스로 OutOfMemoryErrorThreadDeath 와 같이 주로 JVM 에서 발생하기에 애플리케이션 코드에서 try-catch 로 잡을 수 없습니다. 시스템 레벨의 에러이므로 애플리케이션 내에서는 해당 에러에 대한 처리를 신경 쓰지 않아도 됩니다.

Exception과 checked 예외

java.lang.Exception 클래스의 하위 클래스로 위의 Error 와 달리 애플리케이션 코드에서 try-catch 로 잡을 수 있는 상황에 사용됩니다.

예외는 RuntimeException을 상속한 unchecked 예외구현하지 않은 checked 예외로 나눠집니다.

(그림1)

일반적으로 예외가 발생했다라고 하면 checked 예외라고 생각하면 되며, checked 예외는 try-catch 문으로 감싸서 처리하거나 throws를 선언해서 예외를 넘겨야 합니다.

그렇지 않으면 컴파일 에러가 발생합니다.