@Override
@Nullable
public <T> T execute(ConnectionCallback<T> action) throws DataAccessException {
Assert.notNull(action, "Callback object must not be null");
Connection con = DataSourceUtils.getConnection(obtainDataSource());
try {
// Create close-suppressing Connection proxy, also preparing returned Statements.
Connection conToUse = createConnectionProxy(con);
return action.doInConnection(conToUse);
}
catch (SQLException ex) {
// Release Connection early, to avoid potential connection pool deadlock
// in the case when the exception translator hasn't been initialized yet.
String sql = getSql(action);
DataSourceUtils.releaseConnection(con, getDataSource());
con = null;
throw translateException("ConnectionCallback", sql, ex);
}
finally {
DataSourceUtils.releaseConnection(con, getDataSource());
}
}
protected DataAccessException translateException(String task, @Nullable String sql, SQLException ex) {
DataAccessException dae = getExceptionTranslator().translate(task, sql, ex);
return (dae != null ? dae : new UncategorizedSQLException(task, sql, ex));
}
- 위는 JdbcTemplate.java 의 소스 코드 중 한 부분인데, 보면 SQLException이 발생했을 때, translateException을 통해서 DataAccessException 의 예외로 전환해서 다시 에러를 발생시킴!
- JdbcTemplate 내부적으로 CheckedException(SQLException) → UncheckedException(DataAccessException) 으로 전환해서 에러를 발생시킴
- 왜냐하면 SQLException은 복구가 가능한 예외가 아닌 시스템의 예외임. 쉽게 말해 프로그램의 오류 또는 개발자의 부주의 때문에 발생하는 경우이거나, 통제할 수 없는 외부상황 때문에 발생해 코드 레벨에서는 복구할 방법이 없다는 것임
- 이와 같이 함으로 DataAccessException은 SQLException에 대해 애플리케이션 레벨에서 신경을 쓰지 않도록 해주고, SQLException에 담긴 다루기 힘든 상세한 예외 정보를 의미 있는 예외로 전환시켜줌