[Spring 3.1] 스프링과 예외처리
자바에서 예외는 세 가지 종류로 구분된다.
1. Error 클래스
OutOfMemoryError, ThreadDeath 같이 시스템에 비정상적인 상황이 발생한 경우 나타나는 예외이다.
애플리케이션에서는 신경쓰지 않아도 된다.
2. Exception 체크 예외
Exception 클래스의 하위 클래스 중 RuntimeException 클래스를 상속받지 않은 클래스를 의미한다.
3. Exception 언체크 예외
Exception 클래스의 하위 클래스 중 RuntimeException 클래스를 상속받은 클래스를 의미한다.
체크 예외가 발생할 수 있는 메서드에서는 반드시 예외를 처리하는 코드를 추가해야 한다. (컴파일 시점에서 검증된다)
언체크 예외를 처리하는 코드는 강제되지 않는다. 언체크 예외에 대해 알고 있다면 이 부분을 이해하기 쉽다.
언체크 예외는 NullPointerException 같이 개발자의 부주의에서 발생하는 에러이기 때문에 체크 예외와는 성격이 달라 런타임 예외라고 부르기도 한다.
try - catch 구문으로 예외가 발생한 부분을 잡았다고 해 보자.
발생한 예외는 어떻게 처리하는게 좋을까? 그저 에러 메세지를 print 하는것으로 충분할까?
1. 예외 복구
예외 상황을 파악하고 문제를 해결한 후 정상 상태로 원복시키는 방법이다.
정수를 0으로 나눠서 예외를 발생한 경우를 생각해보자. 사용자에게 0으로 나누지 말라는 메세지를 출력해 다른 작업 흐름으로 자연스럽게 유도한다면 예외를 복구했다고 할 수 있다.
2. 예외 회피
예외 처리의 책임을 호출한 쪽으로 던지는 방법이다.
메서드를 선언할 때 throws 구문으로 예외 발생 시 알아서 던지도록 설계하거나 catch 구문 내부에서 throw 구문을 사용해 자신을 호출한 부분으로 예외 처리를 넘긴다.
예외 처리를 회피한다는 건 발생한 예외가 해당 계층에서 처리되는 편 보다 다른 계층에서 처리되는 편이 합리적이라고 판단되는 경우이다.
관심사의 분리에 입각해도 좋고, 기타 다른 이유에 입각해도 괜찮다. 예외를 회피할 때는 적합한 이유가 있어야 한다.
3. 예외 전환
예외를 밖으로 던지는 건 같지만, 발생한 예외를 적절한 예외로 변환한 후 던지는 방법이다.
SQLException -> DuplicateUserIdException 예시를 생각하면 이해하기 쉽다.
의미가 분명한 예외가 던져지면 받는 쪽에서는 복구 작업을 쉽게 수행할 수 있다.
대응이 불가능한 체크 예외라면 빠르게 런타임 에러로 변환한 후 던져주는 부분이 포인트이다.
스프링의 JdbcTemplate은 내부에서 발생하는 모든 SQLException을 런타임 예외인 DataAccessException 예외로 변환해서 던지고, DataAccessException의 서브 클래스로 디테일한 예외 클래스를 정의해서 사용한다.
MySQL, Oracle.. DB마다 에러 코드가 모두 다르지만, 스프링은 에러 코드 매핑정보 테이블을 만들어 두고 예외가 발생한 이유에 따라서 적절히 변환해 적합한 예외 클래스를 던지는 방식으로 동작한다.
'Spring > Spring 3.1' 카테고리의 다른 글
[Spring 3.1] Aspect Oriented Programming (0) | 2023.04.28 |
---|---|
[Spring 3.1] 트랜잭션과 서비스 추상화 (0) | 2023.04.23 |
[Spring 3.1] 템플릿과 콜백 (0) | 2023.04.19 |
[Spring 3.1] 스프링과 테스트 (0) | 2023.04.16 |
[Spring 3.1] 관심사의 분리와 스프링 (0) | 2023.04.13 |
댓글
이 글 공유하기
다른 글
-
[Spring 3.1] Aspect Oriented Programming
[Spring 3.1] Aspect Oriented Programming
2023.04.28 -
[Spring 3.1] 트랜잭션과 서비스 추상화
[Spring 3.1] 트랜잭션과 서비스 추상화
2023.04.23 -
[Spring 3.1] 템플릿과 콜백
[Spring 3.1] 템플릿과 콜백
2023.04.19 -
[Spring 3.1] 스프링과 테스트
[Spring 3.1] 스프링과 테스트
2023.04.16