ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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
    [JDBC] 트랜잭션  (0) 2024.11.05
Designed by Tistory.