SQL
과 관련한 부분은 뒤에서 다루고
SQLException
의 비표준 에러 코드와 SQL 상태 정보에 대한 해결책
SQL 상태코드와 DB 전용 에러 코드
SQLException
에 담긴 SQL 상태코드는 신뢰할만한 게 아니다.
- JDBC 드라이버를 만들 때 들어가는 것.
- 같은 DB 라 하더라도 드라이버마다 달라질 수 있다.
- DB 전용 에러 코드가 더 정확한 정보라 할 수 있다.
- DB 에서 직접 제공해주는 것이니 버전이 올라가도 어느정도 일관성 유지 가능
DB 별 에러 코드를 참고해서 발생한 예외의 원인이 무엇인지 해석해주는 기능을 만들자.
- 키 값이 중복되어 중복 오류가 발생한다면
- MySQL 1062
- Oracle 1
- DB2 -803
- 이런 에러 코드 값을 확인할 수 있다면
SQLException
을 DuplicateKeyException
에러로 전환
- 의미가 분명히 드러나도록
- DB 종류 상관 없이 일관된 예외를 받을 수 있다면 효과적인 대응이 가능하다.
Spring 이 제공하는 DataAccessException
의 서브 클래스로 세분화된 예외 클래스
BadSqlGrammarException
DataAccessResourceFailureException
DataIntegrityViolationException
- 데이터 제약 조건을 위배하거나 일관성을 지키지 않는 작업을 수행할 경우
DuplicatedKeyException
DB 마다 제각각인 에러 코드에 대한 스프링의 대응
- DB 별 에러 코드를 분류
- 스프링이 정의한 예외 클래스와 매핑해놓은 에러 코드 매핑정보 테이블을 만들고 이용
JdbcTemplate
은 DB 의 에러 코드를 DataAccessException
계층 구조의 클래스 중 하나로 매핑
JdbcTemplate
에서 전환되어 던져진 예외는 모두 DataAccessException
의 서브 클래스 타입
- DB 가 달라져도 같은 종류의 에러라면 동일한 예외를 받을 수 있다.
- 체크 예외인
SQLException
을 런타임 예외인 DataAccessException
전환하여 던진다
- add() 는 예외 포장을 위한 코드가 따로 없다.
- 중복 키로 발생한 에러는
DuplicateKeyException
extends DataAccessException 으로 전환
- DB 를 변경하더라도 동일한 예외가 던져지는 것이 보장된다.
public void add(final User user) throws DuplicateUserIdException {
// JdbcTemplate 를 이용해 User 를 add 하는 코드
}