UnChecked예외 (데이터 접근)
- 생성방법
- UnChecked예외를 먼저 만든다
- Checked -> UnChecked 예외로 변경 (변경시, 에러코드가 존재하면 해당 예외로 변경)
- 예외처리
public class DBErrorException extends RuntimeException{ ///... }
public class Service{
//...
try{
logic();
}catch (SQLException e){
if ( e.getErrorCode().isEqualTo(42122) ){
// 42122는 "SQL bad Grammer" 오류 코드
throw new DBErrorException(e);
}else{
throw new RuntimeException(e);
}
}
//...
}
Spring 에러코드 정리
- sql-error-codes.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="DB2" name="Db2" class="org.springframework.jdbc.support.SQLErrorCodes">
<property name="databaseProductName">
<value>DB2*</value>
</property>
<property name="badSqlGrammarCodes">
<value>-007,-029,-097,-104,-109,-115,-128,-199,-204,-206,-301,-408,-441,-491</value>
</property>
<property name="duplicateKeyCodes">
<value>-803</value>
</property>
<property name="dataIntegrityViolationCodes">
<value>-407,-530,-531,-532,-543,-544,-545,-603,-667</value>
</property>
<property name="dataAccessResourceFailureCodes">
<value>-904,-971</value>
</property>
<property name="transientDataAccessResourceCodes">
<value>-1035,-1218,-30080,-30081</value>
</property>
<property name="deadlockLoserCodes">
<value>-911,-913</value>
</property>
</bean>
<bean id="H2" class="org.springframework.jdbc.support.SQLErrorCodes">
<property name="badSqlGrammarCodes">
<value>42000,42001,42101,42102,42111,42112,42121,42122,42132</value>
</property>
<property name="duplicateKeyCodes">
<value>23001,23505</value>
</property>
<property name="dataIntegrityViolationCodes">
<value>22001,22003,22012,22018,22025,23000,23002,23003,23502,23503,23506,23507,23513</value>
</property>
<property name="dataAccessResourceFailureCodes">
<value>90046,90100,90117,90121,90126</value>
</property>
<property name="cannotAcquireLockCodes">
<value>50200</value>
</property>
</bean>
<!-- 여러 DB들 -->
</beans>
스프링 데이터 접근 예외 계층
- RuntimeException으로 상속 (Unchecked 예외)
- DataAccessException이 데이터접근 최상위 예외
- 에러코드에 따른, 여러 예외 존재 (Bad Sql, DB Timeout .... )

스프링 예외 추상화
SQLExceptionTrnaslator는 여러 DB 에러코드 변환기로서, 어떠한 DB를 사용하더라도 에러코드에 맞는 예외를 던져준다
(데이터접근 예외 계층 확인)
private final SQLExceptionTranslator exTranslator = new SQLErrorCodeSQLExceptionTranslator(dataSource);
void func(){
try{
logic();
}catch (SQLException e){
throw exTranslator.translate("[예외 확인 글자]" , [sql문], e);
}
}
[세부설명]
SQLExceptionTranslator
@FunctionalInterface
public interface SQLExceptionTranslator {
@Nullable
DataAccessException translate(String task, @Nullable String sql, SQLException ex);
}
SQLErrorCodeSQLExceptionTranslator(DataSource)
public SQLErrorCodeSQLExceptionTranslator(DataSource dataSource) {
this();
this.setDataSource(dataSource);
}
translate()
@FunctionalInterface
public interface SQLExceptionTranslator {
@Nullable
DataAccessException translate(String task, @Nullable String sql, SQLException ex);
}
정리
- 직접 예외를 만들어서 (RuntimeException 상속), 에러코드에 따라 만들어도됨
- 스프링이 만들어둔 데이터 접근 예외처리를 에러코드에 따라 만들어도 됨
- 스프링 예외 변환기를 활용하여, 에러코드는 모르더라도 스프링의 데이터 접근 예외처리를 이용
'데이터베이스 > JDBC' 카테고리의 다른 글
[JDBC] JDBC 템플릿 (1) | 2024.11.06 |
---|---|
@Transactional (0) | 2024.11.06 |
[JDBC] 트랜잭션 템플릿 (1) | 2024.11.06 |
[JDBC] 트랜잭션 매니저 (0) | 2024.11.05 |