1. SQLExcpetion
JDBC는 모든 Exception을 SQLException 에 하나에 모두 담아버린다. 대부분의 SQLException은 복구가 불가능하다. DAO 밖에서 SQLException을 다룰 수 있는 가능성은 거의 없다. 따라서 필요도 없는 기계적인 throws 선언이 등장하도록 방치하지 말고 가능한 한 빨리 언체크/런타임 예외로 전환해줘야 한다.
2. DataAccessException
런타임 예외이고 DataAccessException 중 가장 루트 class이다.
JdbcTemplate 템플릿과 콜백 안에서 발생하는 모든 SQLException을 런타임 예외인 DataAccessException으로 포장해서 던져준다.
Spring에서 DB 관련 Exception 은 DataAccessException 으로 한번 감싸줘서 알려준다고 보면 된다.
DBMS에 따라서 에러코드가 다를텐데 그래도 코드는 스프링에서 일관적으로 보여주니 일관성이 있어서 좋을 것이다.
- dbcTemplate은 SQLException을 단지 런타임 예외인 DataAccessException으로 포장하는 것이 아니라 DB의 에러 코드를 DataAccessException 계층구조의 클래스 중 하나로 매핑해준다.JdbcTemplate에서 던지는 예외는 모두 DataAccessException의 서브클래스 타입이다.
- 드라이버나 DB 메타정보를 참고해서 DB 종류를 확인하고 DB별로 미리 준비된 매핑정보를 참고해서 적절한 예외 클래스를 선택하기 때문에 DB가 달라져도 같은 종류의 에러라면 동일한 예외를 받을 수 있는 것이다.
DataAccessException 특징
* 일관된 예외처리를 하기 위함.
* SQLException이나 HibernateException등과 같은 특정 기술에 의존적인 예외를 던지지 않음.
* 모든 DAO Exception은 org.springframework.dao.DataAccessException의 서브 클래스.
* 데이터 접근 인터페이스가 구현에 의존적인 예외가 아닌 스프링의 일반적인 예외를 던짐으로서,
persistence 구현에 결합되는 일을 방지.
* RuntimeException이기 때문에 비검사 예외(unchecked Exception)에 속함.
-> DAO 에서 던진 예외를 코드에서 반드시 처리하지 않아도 된다는 의미.
-> 검사 예외 (checked Exception)은 과도한 catch나 throws절을 불러 코드를 난잡하게 할 수 있다는
스프링의 일반적인 철학을 따르는 것.
* NestedRuntimeException의 서브클래스.
-> 항상 NestedRuntimeException의 getCause()메서드를 통해 루트 예외인 Exception을 사용할 수 있다.
* Spring은 DAO 지원에 관한 특정 기술에 대한 예외들을 인식하며, 각 데이터베이스 제품의 에러 코드까지 인식.
* 자신의 예외 분류 체계에 있는 좀 더 특정한 예외중의 하나를 사용하여 다시 던질 수 있다.
---------------------------------------------------------------------------------------------------------------------
** CleanupFailureDataAccessException
=> 성공적으로 작동한 후 데이터베이스 자원을 반환할 때 발생하는 경우 (Connection 반환 등)
** DataAccessResourceFailureException
=> 데이터베이스 연동 실패 등 접근 실패
** DataIntegrityViolationException
=> 유일키 제약 (Unique Constraint) 위반과 같은 정합성 위반이 삽입 (Insert) / 갱신 (Update)의 결과로
발생한 경우
** DeadlockLoserDataAccessException
=> 현재의 프로세스가 교착상태(deadlock)에 빠진 경우
** IncorrectUpdateSemanticsDataAccessException
=> 원하는 수보다 많은 레코드를 갱신하는 등 갱신 작업에 있어서 의도하지 않은 어떤 일이 발생하는 경우.
@ 트랜잭션이 롤백 되지 않음!
** InvalidDataAccessApiUsageException
=> 실행되기 전에 컴파일 되어야 할 질의문의 컴파일에 실패하는 등 데이터 접근 자바 API를 잘못 사용하는 경우
** InvalidDataAccessResourceUsageException
=> 관계형 데이터베이스 접근을 위해 잘못된 SQL 문법을 사용하는 등 자원에 대한 접근을 잘못하는 경우
** OptimisticLockingFailureException
=> 낙관적 잠금(optimistic locking)에 실패한 경우. 이 예외는 ORM 툴이나 커스텀 DAO 구현체에 의해 발생된다.
* 낙관적 잠금(optimistic locking)
동일한 데이터에 정확히 동시에 접근하는 일이 발생할 확률이 매우 낮을 것이라고 낙관하여 배타적 잠금을 하지 않는, 즉 데이터에 대한 동시 접근을 허용하는 정책
** TypeMismatchDataAccessException
=> String을 데이터베이스의 숫자 컬럼에 삽입하려고 하는 등 자바 타입과 데이터 타입이 일치하지 않는 경우
** UncategorizedDataAccessException
=> 무엇인가 잘못됐지만 좀 더 구체적으로 판별할 수 없는 경우
'SPRING > Spring' 카테고리의 다른 글
[스프링] Session과 Cookie , HttpSession (2) | 2021.09.14 |
---|---|
[스프링]HTTP프로토콜과 URI를 통한 요청 (0) | 2021.09.08 |
HttpserveltRequest와 HttpSession,세션과 로그인 로그아웃 (0) | 2021.08.03 |
UriComponents과 URLEncoding (0) | 2021.07.31 |
AOP를 이용한 트랜잭션 구현 중 트랜잭션이 먹지 않는 현상과 메모리누수경고(Memory leak)=(톰캣구동안됨) 404에러 해결 (0) | 2021.07.21 |