티스토리 뷰

데이터베이스/JDBC

[JDBC] 스프링 예외 변환기

거북이의 기술블로그 2024. 11. 6. 18:45

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
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함