스프링 예외 추상화

wangjh789·2022년 8월 15일
0

[Spring] 스프링-DB-1

목록 보기
14/15

스프링은 데이터 접근 계층에 대해 수십가지 예외를 정리해서 일관된 예외 계층을 제공한다.
각각의 예외는 특정 기술에 종속적이지 않게 설계되어 있다. 따라서 서비스 계층에서도 스프링이 제공하는 예외를 사용하면 된다. (JDBC 기술을 쓰든 JPA 기술을 쓰든 상관 없음)

스프링에서 제공하는 데이터 접근 계층의 모든 예외는 런타임 예외이다.
NonTransient 예외
일시적인 예외로, 동일한 SQL을 수행할 경우 성공할 가능성이 있다.
Transient 예외
일시적이지 않은 예외, SQL 문법 오류나 제약조건 위배 등

각 DB마다 SQL ErrorCode는 다르다.

스프링이 제공하는 예외 변환기

스프링은 Db에서 발생하는 오류코드를 스프링이 정의한 예외로 자동으로 변환해주는 변환기를 제공한다.(@Repository 를 붙이면 에러를 파싱해준다.)
SQLExceptionTranslator

    @Test
    void exceptionTranslator() {
        String sql = "select bad grammer";
        try {
            Connection con = dataSource.getConnection();
            PreparedStatement stmt = con.prepareStatement(sql);
            stmt.executeUpdate();
        } catch (SQLException e) {
            Assertions.assertThat(e.getErrorCode()).isEqualTo(42122);

            SQLExceptionTranslator exTranslator = new SQLErrorCodeSQLExceptionTranslator();
            DataAccessException resultEx = exTranslator.translate("select", sql, e);
            log.info("resultEx", resultEx);
            Assertions.assertThat(resultEx).isInstanceOf(BadSqlGrammarException.class);
        }
    }

SQLExceptionTranslatororg.springframework.jdbc.support.sql-error-codes.xml 을 참조해 에러를 변환해 반환한다.

만약 서비스, 컨트롤러 계층에서 예외 처리가 필요하면 특정 기술에 종속적인 SQLException을 직접 사용하는 것이 아니라, 스프링이 제공하는 데이터 접근 예외를 사용하면 된다.
물론 스프링이 제공하는 예외를 사용하기 떄문에 스프링에 대한 기술 종속성은 발생한다.

profile
기록

0개의 댓글