달력

52024  이전 다음

  • 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
반응형
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은 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 참고..

 

반응형
Posted by 친절한 웬디양~ㅎㅎ
|