먼저,,
아래와 같이 처리를 하는걸로 가다,
더욱 간단하고 쉬운 방법이 있어, 전환!!!
역시 공부를 해야한다..;;;
스프링을 알고 접근하는게 아니라
일단 소스부터 까보는게 익숙한 나로선,
이런 삽질이.... 흔하다.. ;;
흠, 간단하다.
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 함수를 이용해서 처리하면 될 것이다.
아래와 같이 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 참고..
또 하나 배워간다.
ㅋㅋ
오예~~~
---------------------------------------------------------------------------------------------------------
흠,
이번건은 좀 대박..
Spring-myBatis 환경에서 Exception처리 중,
SQL Exception 발생시 별도 처리 방법에 대해서는 이전 포스트에서 설명했다.
이걸로 모두 처리 될 줄 알았는데,, 정말 단순하게..
그런데 위 방법은 iBatis 쿼리 호출시 SqlMapClientTemplate 를 이용했을때
가능한 방법이었다.
즉, 저건 Spring을 이용해서 iBatis를 이용하는 방법으로서,
SQL Exception을 Spring이 Translate해서
Spring Exception(DataAccessException)으로 변경해서 보내준다.
이게 의미가 큰 이유가..
SqlMapClient를 이용했을 시에는 SQL Exception만 발생시켜주는데,
이 Exception에서는 무슨이유에선지 getErrorCode()라는 메서드가 있음에도 불구하고
Sql Error code를 알려주지 못하고 계속 '0' 만 뱉어 낸다.
그런데,
SqlMapClientTemplate 를 이용했을 때
(getSqlMapClientTemplate().queryForList() 등..)
SQL Exception이 발생하면
DataAccessException으로 translate해 주고,
이 DataAccessException을 통해서 기존 SQL Exception을 뽑아 정상적으로
getErrorCode() 등의 메서드를 사용할 수 있게 되는 것이다.
머나먼 길을 돌아서 이걸 찾아낸것 같다.
'Back-End > Spring' 카테고리의 다른 글
[Jasypt] jdbc.properties 접속정보 PBEWithMD5AndDES 암호화 2 (0) | 2015.04.21 |
---|---|
Spring Exception 분류 (0) | 2014.03.05 |
@RequestParam - 1:1로 파라미터 집어넣기 (0) | 2012.09.11 |
@ModelAttribute - 파라메터 한번에 집어넣기 (0) | 2012.09.11 |
스프링에서 Quartz 를 사용하여 잡스케줄링 하기 [출처] [본문스크랩] 스프링에서 Quartz 를 사용하여 잡스케줄링 하기|작성자 onandme (0) | 2012.08.17 |