FireDrago
[Spring] DB 예외처리 본문
Service 객체가 특정 예외에 종속되는 경우가 있을 수있다.

위 로직에서 메서드는 SQLException 예외를 던지고 있다.
그런데 SQLException 예외는 JDBC를 사용할때 발생하는 예외이고,
JPA로 기술을 변경하는 경우, SQLException 예외 객체도 함께 수정해야하는 문제가 발생한다.
이 문제를 예방하기 위해 스프링에서는 예외 추상화 하여 제공한다.
<스프링 추상화 예외>

스프링은 데이터 접근 계층에 대한 수십가지 예외를 정리해서 일관된 예외 계층을 제공한다.
특정기술의 종속없이 기술이 변경되어도 예외객체를 변경할 필요가 없다.
RuntimeException을 상속했기때문에, 명시적으로 예외를 처리해주지 않아도 된다.


스프릥은 SQL 예외 변환기를 제공한다.
translate() 메서드의 첫번째 파라미터는 읽을 수 있는 설명이고,
두번째는 실행한 sql, 마지막은 발생된SQLException 을 전달하면 된다.
이렇게 하면 적절한 스프링 데이터 접근 계층의 예외로 변환해서 반환해준다.
반환 타입은 최상위 타입인 DataAccessException 이지만 실제로는BadSqlGrammarException 예외가 반환된다.
각 DB 마다 에러코드는 다르지만, 에러코드에 따른 에러객체를 정의해놓은 sql-error-codes.xml 파일을
참조하여, 예외변환기는 적절한 예외 객체를 반환한다.


예외변환기를 멤버변수로 등록하고, translate 메서드를 이용하여 적절한 예외객체로 변환한다.
Runtime 예외이므로, 예외를 처리해주지 않아도 되고, 특정 기술에 종속되지도 않는다.
<JDBC Template>
JDBC 템플릿은 매번 반복되는 코드의 반복을 효과적으로 처리한다.
뿐만아니라 트랜잭션을 위한 커넥션 동기화, 스프링 예외변환까지 자동으로 실행해준다.


트랜잭션을 이용하면, 코드가 파격적으로 깔끔해진다. 위에서 배운 스프링 예외변환과
커넥션 동기화 까지 처리해준다.
'프로그래밍 > Spring' 카테고리의 다른 글
| [Spring] MyBatis 사용하기 (0) | 2024.03.07 |
|---|---|
| [Spring] DB 연결을 테스트 하기 (0) | 2024.03.06 |
| [Spring] 트랜잭션과 스프링 (0) | 2024.02.28 |
| [Spring] 파일업로드 (0) | 2024.02.22 |
| [Spring] 스프링 타입 컨버터와 포매터 (0) | 2024.02.21 |
