2013/07/12 17:46

Spring에서 SQL Eception 처리하기. Spring



먼저,, 
아래와 같이 처리를 하는걸로 가다, 
더욱 간단하고 쉬운 방법이 있어, 전환!!!

역시 공부를 해야한다..;;; 
스프링을 알고 접근하는게 아니라
일단 소스부터 까보는게 익숙한 나로선,
이런 삽질이.... 흔하다.. ;;

흠, 간단하다.
SQL Exception의 경우 
DB, jdbc 마다 다 코드의 종류도 에러의 종류도 다르기에
Spring이 wrapper해서 처리해 주는거고,, (공통으로.)
물론 기존의 Exception을 잡아서 처리 할수 있도록 하기 위해.. 
getRootCause() 라는 메소드를 준비해 놓았다.
즉,
Exception이 들어왔다면,, (Exception handler 등을 사용하였다 가정..)
이게 DataAccessException인지 체크하고,
getRootCause() 메소드를 통해서 code를 뽑거나,
기존 Exception 메시지를 뽑으면 된다!!

코드는 간단하다.

if (ex instanceof DataAccessException) {

       SQLException se = (SQLException) ((DataAccessException) ex).getRootCause();

       msg = se.getMessage();

       LOGGER.debug("****** DataAccessException : {} // {}", se.getErrorCode(), se.getMessage());

}

 

처리 방법은 다양하게 응용할 수 있겠다..

저 코드를 보고나니,,
아래 처리방법은 정말,, 한심할 수준..

그리고,
또한번 Spring이라는게 얼마나 쓸모있는 엄청난 프레임워크인지를
다시한번 깨닫게 되는... 

하,, 
나도 잘하고 싶다구~~~ 

------------------------------------

벌써 오늘도 두번째 문의가 들어온 내용이라,
왜 이걸 정리 안해놨지? 라는 생각을 하며
올린다..ㅋ


Spring은 SQL Exception이 발생하면
자신의 Exception으로 wrapping해서 throw하기 때문에
기존에 봤었던 SQL Exception에 맞는 메시지처리 등의
작업을 하기 위해서는 별도 작업을 추가적으로 해 주어야 한다.

아래와 같이 instanceof 함수를 이용해서 처리하면 될 것이다.

 

if (ex instanceof BadSqlGrammarException) {

       SQLException se = ((BadSqlGrammarException) ex).getSQLException();

       LOGGER.debug("**BadSqlGrammarException {} ", se.getErrorCode());

}

else if (ex instanceof InvalidResultSetAccessException) {

       SQLException se = ((InvalidResultSetAccessException) ex).getSQLException();

       LOGGER.debug("**InvalidResultSetAccessException {} ", se.getErrorCode());

}

else if (ex instanceof DuplicateKeyException) {

       LOGGER.debug("**DuplicateKeyException {} ", ex.getMessage());

}

else if (ex instanceof DataIntegrityViolationException) {

       LOGGER.debug("**DataIntegrityViolationException {} ", ex.getMessage());

}

else if (ex instanceof DataAccessResourceFailureException) {

       LOGGER.debug("**DataAccessResourceFailureException {} ", ex.getMessage());

}

else if (ex instanceof CannotAcquireLockException) {

       LOGGER.debug("**CannotAcquireLockException {} ", ex.getMessage());

}

else if (ex instanceof DeadlockLoserDataAccessException) {

       LOGGER.debug("**DeadlockLoserDataAccessException {} ", ex.getMessage());

}

else if (ex instanceof CannotSerializeTransactionException) {

       LOGGER.debug("**CannotSerializeTransactionException {} ", ex.getMessage());

}



추가로 스프링 프레임워크에서 처리하는 oracle 에러코드 목록은 아래와 같다.

<bean id="Oracle" class="org.springframework.jdbc.support.SQLErrorCodes">

       <property name="badSqlGrammarCodes">

              <value>900,903,904,917,936,942,17006</value>

       </property>

       <property name="invalidResultSetAccessCodes">

              <value>17003</value>

       </property>

       <property name="duplicateKeyCodes">

              <value>1</value>

       </property>

       <property name="dataIntegrityViolationCodes">

              <value>1400,1722,2291,2292</value>

       </property>

       <property name="dataAccessResourceFailureCodes">

              <value>17002,17447</value>

       </property>

       <property name="cannotAcquireLockCodes">

              <value>54</value>

       </property>

       <property name="cannotSerializeTransactionCodes">

              <value>8177</value>

       </property>

       <property name="deadlockLoserCodes">

              <value>60</value>

       </property>

</bean>


더 자세하게 분석하길 원하면..
org.springframework.jdbc.support.SQLErrorcodesSQLExceptionTranslator Class 참고..


또 하나 배워간다. 
ㅋㅋ
오예~~~

핑백

덧글

댓글 입력 영역