백엔드/프레임워크

[토비의 스프링] 4장: 예외

박지환 2023. 2. 4. 15:03
토비의 스프링: Vol. 1: 스프링의 이해와 원리

 

예외를 처리할 때 반드시 지켜야 할 핵심 원칙: 모든 예외는 적절하게 복구되든지 아니면 작업을 중단시키고 운영자 또는 개발자에게 분명하게 통보되어야 함

예외의 종류와 특징

  • java.lang.Error (JVM 에러)
  • java.lang.Exception (애플리케이션 에러)

예외처리 방법

예외 복구

예외상황을 파악하고 문제를 해결해서 정상 상태로 돌려놓는 방법

예외처리 코드를 강제하는 체크 예외들이 예외를 복구할 가능성이 있는 경우에 사용함

예외처리 회피

예외처리를 자신이 담당하지 않고 자신을 호출한 쪽으로 던지는 방법 → throws ...

예외 전환(exception translation)

발생한 예외를 그대로 넘기지 않고, 적절한 예외로 전환해서 던지는 방법

전환하는 예외에 원래 발생한 예외를 담아서 중첩 예외로 만드는 것이 좋음

예외 포장: 예외처리를 강제하는 체크 예외를 언체크 예외인 런타임 예외로 바꾸는 경우 사용

예외 전환의 목적

  • 런타임 예외로 포장해서 굳이 필요하지 않은 catch/throws를 줄임
  • 로우레벨의 예외를 좀 더 의미 있고 추상화된 예외로 바꿔서 던져줌

서버환경에서의 예외처리

자바 엔터프라이즈 서버환경에서는 요청을 처리하는 중에 예외가 발생하면 해당 작업만 중단시키고, 서버 관리자나 개발자에게 통보하는 것이 낫기 떄문에 체크 예외의 활용도는 매우 떨어진다. 이에 언체크 예외 (런타임 에러)로 처리하는 것이 일반화 되고 있다

애플리케이션 예외: 시스템 또는 외부의 예외상황이 원인이 아니라 애플리케이션 자체의 로직에 의해 의도적으로 발생시키고, 반드시 catch 해서 무엇인가 조치를 취하도록 요구하는 예외

정상적인 흐름을 따르는 코드는 그대로 두고, 잔고 부족과 같은 예외 상황에서는 비즈니스적인 의미를 띈 예외를 던지도록 만드는 방법을 사용

DB에서의 예외 전환

SQLException 등 시스템의 예외라면 애플리케이션 레벨에서 복구할 수 있는 방법은 없으므로, 관리자나 개발자에게 빠르게 통보하는 방법 밖에는 없음 → 해당 예외들은 불필요하게 throw 하지 말고 언체크/런타임 예외로 전환해 줘야함 → JdbcTemplate 등 스프링의 대부분의 API 메소드들은 런타임 예외로 정의되고, 포장되어 던져짐

DB 업체별로 에러 코드가 다름 → 스프링에서는 DB 별 에러 코드를 분류해서 스프링이 정의한 예외 클래스와 매핑해놓은 에러 코드 매핑정보 테이블을 만들어두고 이를 이용하므로, DB를 변경하더라도 동일한 예외가 던져지는 것이 보장됨

다양한 데이터 액세스 기술들은 자신만의 독자적인 예외를 던짐 → (인터페이스와 구현의 분리를 위해) 분리한 로직이 특정 데이터 액세스 기술의 예외로 처리되어 버림 → 기술에 완전히 독립적인 로직을 만들기 위해 예외도 일치시켜야 함 → 스프링은 자바의 다양한 데이터 액세스 기술들의 예외들을 추상화해서 DataAccessException 계층구조 안에 정리해놓음 → 스프링의 데이터 액세스 지원 기술을 이용해 만들면 사용 기술에 독립적인 일관성 있는 예외를 던질 수 있음

정리

앤터프라이즈 애플리케이션에서 사용할 수 있는 바람직한 예외처리 방법: 언체크 예외 (런타임 에러)의 활용

주요 내용

  • 예외를 잡아서 아무런 조취를 취하지 않거나 의미 없는 throws 선언을 남발하는 것은 위험하다
  • 예외는 복구하거나 예외처리 오브젝트로 의도적으로 전달하거나 적절한 예외로 전환해야 한다
  • 좀 더 의미 있는 예외로 변경하거나, 불필요한 catch/throws를 피하기 위해 런타임 예외로 포장하는 두 가지 방법의 예외 전환이 있다
  • 복구할 수 없는 예외는 가능한 한 빨리 런타임 예외로 전환하는 것이 바람직하다
  • 애플리케이션의 로직을 담기 위한 예외는 체크 예외로 만든다
  • JDBC의 SQLException은 대부분 복구할 수 없는 예외이므로 런타임 예외로 포장해야 한다
  • SQLException의 에러 코드는 DB에 종속되기 때문에 DB에 독립적인 예외로 전환될 필요가 있다
  • 스프링은 DataAccessException을 통해 DB에 독립적으로 적용 가능한 추상화된 런타임 예외 계층을 제공한다
  • DAO를 데이터 액세스 기술에서 독립시키려면 인터페이스 도입과 런타임 예외 전환, 기술에 독립적인 추상화된 예외로 전환이 필요하다

 

Reference: http://www.yes24.com/Product/Goods/7516721

 

토비의 스프링 3.1 Vol. 1 스프링의 이해와 원리 - YES24

대한민국 전자정부 표준 프레임워크 스프링을 설명하는 책!단순한 예제를 스프링 3.0과 스프링 3.1의 기술을 적용하며 발전시켜 나가는 과정을 통해 스프링의 핵심 프로그래밍 모델인 IoC/DI, PSA, A

www.yes24.com