티스토리 뷰
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
링크
TAG
- Java
- Spring
- SQL
- HTML5
- 게시판 프로젝트
- DFS
- BFS
- db
- 깊이우선탐색
- bean
- 이진탐색
- 게시판
- stack
- 정렬
- 클래스
- JSON
- 코딩테스트
- 검증
- 알고리즘
- 오블완
- JDBC
- 티스토리챌린지
- 타입변환
- 기술면접
- 백준
- 버블정렬
- 예외처리
- Thymeleaf
- 포트폴리오
- 우선순위 큐
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함