우리는 전 페이지에서 최대한 서비스 계층에 순수한 서비스 로직만 남게끔, 즉 예외에 발목이 안잡히게끔 노력했다. 그래서 결국 체크예외를 언체크예외로 커스텀해서 만들고 레포지토리에서 DB별로 제공해주는 ErrorCode를 활용해 복구도 가능한 예외를 만들어서 서비스 로직을 순수하게 만들기는 성공했지만!!!!
결국 그 또한,,, DB별 ErrorCode가 다르기 때문에,, DB를 바꾸게 된다면 또 전체 코드를 바꾸어야 하는 문제가 발생했다!
그래서!!! Spring은 데이터 접근 계층에 대한 수십가지 예외를 정리해서 DataAccessException로 아래 그림과 같이 제공한다! RuntimeException을 상속하고 있기에 언체크 예외이다!!

각각의 예외는 특정 기술에 종속적이지 않게 설계되어 있다. 따라서 서비스 계층에서도 스프링이 제공하는 예외를 사용하면 된다. 예를 들어서 JDBC 기술을 사용하든, JPA 기술을 사용하든 스프링이 제공하는 예외를 사용하면 된다
JDBC나 JPA를 사용할 때 발생하는 예외를 스프링이 제공하는 예외로 변환해주는 역할도 스프링이 제공한다.
WOW!!!
DataAccessException 은 크게 2가지로 구분하는데 NonTransient 예외와 Transient 예외이다.
그래서 스프링은 데이터베이스에서 발생하는 오류 코드를 스프링이 정의한 예외로 자동으로 변환해주는 변환기를 제공한다.