스프링 예외 추상화

Lilac-_-P·2023년 5월 2일
0

스프링 DB

목록 보기
5/9

체크 예외와 언체크 예외

자바가 제공하는 예외처리 매커니즘에서 예외의 종류는 크게 체크 예외와 언체크 예외로 나눌 수 있다. 이 두 종류의 예외는 다음과 같은 특징과 차이점을 가진다.

  • 체크 예외 : 컴파일러가 예외를 체크한다. 즉, 체크 예외는 예외가 발생했을 때 반드시 예외를 try-catch 문으로 잡아서 처리하거나 밖으로 던지는 throws 문을 명시적으로 선언해야한다. 둘 중 하나라도 하지 않으면 컴파일 오류가 발생한다.

  • 언체크 예외 : 컴파일러가 예외를 체크하지 않는다. 언체크 예외는 예외를 반드시 try-catch 문으로 잡아서 처리하거나 밖으로 던지는 throws 문을 선언할 필요가 없다. try-catch 문이나 throws 문을 생략할 수 있는데, 생략하더라도 컴파일 오류가 발생하지 않고, 만약 throws 문을 생략할 경우에는 자동으로 밖으로 예외를 던진다.

체크 예외는 개발자가 실수로 예외를 누락하지 않도록 컴파일러로 문제를 잡아주는 강력하고 훌륭한 안전장치이지만, 동시에 스스로가 언체크 예외의 필요성을 발생시킨 원인이다. 개발자가 모든 체크 예외를 반드시 잡거나 던지도록 처리해줘야하기 때문에, 이는 너무 번거로운 일이 되버리고, 크게 신경쓰고 싶지 않은 예외까지 모두 코드에 선언해줘야한다. 또, 특정 기술에서만 사용하는 예외에 의존하게 되는 단점도 생길 수 있다.

언체크 예외는 체크 예외의 단점을 커버할 수 있는 예외이다. 개발자는 언체크 예외를 반드시 잡거나 던지도록 처리해줄 필요가 없기때문에, 신경쓰고 싶지 않은 예외를 생략할 수 있고, 특정 기술에서만 사용하는 예외도 언체크 예외를 사용하면 코드에 명시적으로 선언하지 않아도 되기 때문에 특정 기술의 예외에 의존하지 않아도 된다. 하지만, 체크 예외는 개발자가 실수로 예외를 누락하더라도 컴파일러가 이를 잡아주지 않는다.


체크 예외와 언체크 예외의 차이는 사실 예외를 처리할 수 없을 때 예외를 밖으로 던지는 부분에 있다. 밖으로 던지는 부분을 필수로 선언해야하는가 생략할 수 있는가의 차이다.

따라서, 체크 예외와 언체크 예외는 상황에 따라 적절하게 섞어서 사용해야한다.
기본적으로는 언체크 예외를 사용하고, 체크 예외는 비즈니스 로직상 의도적으로 던지는 예외에만 사용하는 것이 좋다.

스프링 예외 추상화

스프링은 데이터 접근 계층에 대한 수십 가지 예외를 정리해서 일관된 예외 계층을 제공한다. 각각의 예외는 특정 기술에 종속적이지 않게 설계되어있기 때문에, 서비스 계층에서도 스프링이 제공하는 예외를 사용하면 된다.

따라서 데이터 접근 계층에서 JDBC를 사용하든, JPA를 사용하든 스프링이 제공하는 예외를 사용하면 된다.
JDBC와 JPA를 사용할 때 발생하는 서로 다른 예외를 스프링이 제공하는 예외로 변환해주는 역할도 스프링이 제공한다.

스프링이 제공하는 데이터 접근 계층의 모든 예외는 모두 언체크(런타임) 예외이기 때문에, 서비스 계층은 이를 원하면 잡아서 처리하고, 처리 방법을 모르더라도 throws 문을 명시하지 않고 생략해도 된다.

참고.
Transient 예외는 타임 아웃, 락과 같은 이유로 생기는 일시적인 예외로, 동일한 SQL을 실행하면 성공할 가능성이 있다. 반면에 NonTransient 예외는 일시적이지 않다는 뜻으로, 같은 SQL을 반복 실행해도 실패한다. SQL 문법 오류, DB 제약조건 위배등이 이에 해당한다.

참고.
스프링이 제공하는 예외변환기는 데이터베이스 벤더별로 오류코드에 대한 정보를 알고 있다. 이를 이용해서, 각 벤더별 DB의 서로 다른 오류 코드를 스프링이 제공하는 데이터 접근 계층의 예외로 변환한다.

profile
열심히 하자

0개의 댓글