본문 바로가기
우아한테크코스 4기/레벨2

[Spring] 스프링의 일관된 예외처리

by 나는후니 2022. 5. 12.

스프링에서 제공하는 데이터 접근 객체는 데이터 접근 기술을 쉽고 일관된 방법으로 사용하게 만들고자 하는 목적을 갖고 있습니다. 덕분에 데이터 접근 기술을 변경이 쉽죠. 그 중에서도 각 기술이 변경되더라도 에러 처리에 대한 걱정을 하지 않아도 되는 부분이 발군입니다.

 

이번 포스팅에서는 스프링이 어떤 방식으로 일관된 예외처리를 제공하는지 살펴보고자 합니다.

일관된 예외 계층 구조

스프링은 데이터 접근 기술 중심적인 예외를 일관된 방법으로 처리하는 것을 지원합니다.

아래 코드를 통해 간단히 살펴보겠습니다.

 

jdbcTemplate에서 update 메서드를 이용하면 JdbcOperation에서 상속한 update를 이용하여 쿼리를 날립니다.

JDBC apiexecuteUpdate를 써서 만약 에러가 발생하면 SQLException을 던져주죠 그리고 해당 클래스를 DataAccesException으로 묶어 사용합니다.

 

DataAccessException은 스프링 DAO 예외의 가장 부모 예외 처리로 하위 예외에 대한 내용을 모두 담고 있어 어떤 문제로 예외가 발생했는지 정확하게 파악할 수 있습니다. 또한 DataAccessExceptionRuntimeException입니다. 그 뜻은 SQL에서 발생한 처리할 수 없는 예외를 적절한 계층에서 처리할 수 있도록 유도합니다.

즉, DAO에서의 try-catch구문이 사라지게 되는 것이죠.

DataAccessException의 계층 구조

글의 서두에서 말했듯이 DataAccessException 덕분에 Data Access 기술에 구애받지 않고 예외를 일관되게 처리할 수 있습니다.

위 코드에서 볼 수 있듯, 다른 Data Access 접근 기술도 각 예외를 dao exception hierarachy에 포함되는 예외로 변경해주고 있습니다. 그리고 해당 예외를 DataAccessException으로 던져주고 있습니다.

SQLExceptionTranslator

SQLExceptionTranslator는 SQLException을 DataAccessException으로 변경해주는 역할을 하는 인터페이스입니다. 기본적으로 SQLErrorCodeSQLExceptionTranslator를 상속받아 사용하고 이 구현체는 각 벤더사의 코드를 사용합니다. 벤더사들의 코드를 기반으로 한 메타데이터로부터 exception 정보를 가져와 translate하는 것이죠.

스프링은 이처럼 일관된 에러 처리 방법을 사용하기 때문에 데이터 접근 기술에 구애받지 않고 개발을 할 수 있습니다.