예외(Exception)
사라진 SQLException
JdbcTemplate 적용 이전에 있었던 throws SQLException이 해당 메소드의 의존성 주입 이후에 사라짐을 알 수 있다. SQLException은 Jdbc API 메소드들이 던지는 것이므로 있어야하고, try/catch로 Exception을 잡았다 하더라도 예외 상황의 발생을 알려야한다.
사실 SQLException은 애플리케이션단에서 복구가 힘든 예외이다. 프로그램의 오류, 또는 개발자의 부주의/통제할 수 없는 상황 때문에 발생하는 예외이다. 이러한 시스템 예외의 경우는 애플리케이션단에서 복구할 방법이 없다. 그렇기 때문에 빠른 에러 발생 전달을 해야한다.
초난감 예외처리
대표적으로 예외 처리는 try/catch 로 작성하는데 이에 있어서 문제가 자주 발생한다.
try{
}
catch(SQLException e){
e.printStackTrace();
}
- 예외를 잡고 아무것도 하지 않는다.
- 예외를 콘솔 상에서 print 한다.
위의 예문과 대표적인 두 가지 코드는 흔히 볼 수 있는 개발자의 잘못된 실수/습관이다.
예외가 발생하면 해당 예외에 대해 사용자에게 알리고 적절하게 복구되거나 작업을 중단시키고 작업자 혹은 개발자에게 통보되어야한다.
무의미하고 무책임한 throws
기계적으로 에외들을 throws Exception으로 붙이는 경우도 볼 수 있다. 모든 예외를 블랙홀 처럼 흔적도 없이 먹어치우는것보단 낫지만, 무책임한 throws에서도 문제점을 찾을 수 있다. 사용하는 throws Excpetion 처리된 메소드에 예외가 발생하면 해당 메소드에서 어떠한 예외에 대한 정보도 알 수 없다. 적절한 처리를 통해 복구 될 수 있는 예외처리 상황을 놓치게 된다.
예외의 종류와 특징
Error
java.lang.Error 클래스의 서브 클래스들이다. 해당 에러는 시스템에 비정상적인 상황일 발생했을 경우에 사용된다. 그래서 주로 JVM에서 발생시키는 것이고 애플리케이션 코드에서 잡으려고 하면 안된다.
시스템 레벨에서 특별한 작업을 하는 게 아니라면 애플리케이션에서는 이런 에러에 대한 처리는 신경 쓰지 않아도 된다.
Exceptio과 체크 예외(Checked Exception)
개발자들이 만든 애플리케이션 코드의 작업 중에 예외상황이 발생했을 경우에 사용된다. Exception 클래스는 체크 예외와 언 체크 예외(Unchecked Exception)으로 구분 된다.
체크 예외(Checked Exception)는 RuntimeException을 상속하지 않은 클래스를 말한다.
언 체크 예외(UnChecked Exception)는 RuntimeException을 상속한 클래스들을 말한다. RuntimeException은 Exception의 서브클래스이므로 Exception 일종이지만, 자바는 RuntimeException을 특별하게 다룬다.
체크 예외가 발생할 수 있는 메소드를 사용할 경우 반드시 예외를 처리하는 코드를 함께 작성해야한다. 그렇지 않는다면 컴파일 에러가 발생한다. IOException, SQLException을 비롯해서 예외적인 상황에서 던져질 가능성이 있는 것들 대부분이 체크 예외로 만들어져 있다.
RuntimeException과 언체크/런타임 예외
java.lang.RuntimeException 클래스를 상속한 예외들은 명시적인 예외처리를 강제하지 않기 때문에 언체크 예외라고 불린다. 또는 대표 클래스 이름을 따서 런타임 예외라고도 한다.
예외처리 방법
예외 복구
예외 상황을 파악하고 문제를 해결해서 정상 상태로 돌려놓는 방법이다. MAX_RETRY 등 재시도를 하는 등의 복구가 가능 한 경우 사용한다.
예외처리 회피
발생지에서 예외를 처리하지 않고 호출한 쪽으로 던지는 것이다. throws 문으로 예외가 발생하면 예외를 던지거나, catch문으로 예외를 잡은 후 로그를 남기고 예외를 rethrow 한다.
무책임한 예외처리 회피는 하면 안된다.
예외 전환
예외를 그대로 던지는 회피와 달리 발생한 예외를 그대로 넘기는게 아니라 적절한 예외로 전환하여 던진다는 특징이 있다. 예외를 단순화하고 파악하여 해결할 수 있도록 도와줄 수 있다.
'컴퓨터 > spring' 카테고리의 다른 글
[etc] spring framework와 boot 차이와 동작 (0) | 2021.11.16 |
---|---|
[toby's spring] 2장. 테스트 (0) | 2021.10.24 |
[toby's spring] 1장. 오브젝트(Object)와 의존 관계 - 2 (0) | 2021.10.22 |
[toby's spring] 1장. 오브젝트(Object)와 의존 관계 - 1 (0) | 2021.10.21 |