본문 바로가기

Spring

Toby's Spring - Chap 4 - Exception

자바에서 예외를 처리할 때 try/catch구문을 사용합니다.

그 후 catch에서 예외를 제대로 처리해야 하는데 대부분의 개발자들은 catch로 잡아 놓기만하고 제대로 처리를 하지 않습니다. 그럼 프로그램내에서 닫히지 않은 리소스, 복구 안된 데이터가 DB로 들어가는 등 심각한 문제를 초래할 수 있습니다.

 

Spring에서는 어떤 예외의 종류가 있고 어떻게 처리하는지에 대해서 알아봅시다.

 

에러의 종류와 특징

Error

에러는 시스템에서 뭔가 비정상적인 상황이 발생했을 경우에 사용됩니다.

주로 자바 VM에서 발생시키는 것이고 애플리케이션 코드에서 잡으려고 하면 안 됩니다.

예로는 OutOfMemory, ThreadDeath 같은 에러가 있습니다.

Exception과 체크 예외

에러와 달리 개발자들이 만든 애플리케이션 코드의 작업 중에 예외적인 상황이 발생했을 경우에 사용됩니다.

Exception 클래스는 다시 체크 예외(checked exception), 언체크 예외(unchecked exception)로 나뉘는데 전자는 Exception 클래스의 서브 클래스이면서 RuntimeException을 상속하지 않은 것들이고, 후자는 RuntimeException을 상속한 클래스들을 말합니다.

일반적으로 예외라고 하면 체크 예외라고 생각하면 됩니다.

 

이 중 언체크 예외 즉, 런타임 에러는 피할수 있지만 개발자의 부주의로 인해서 발생하는 경우입니다.

따라서 런타임 에러는 예상하지 못했던 예외상황에서 발생하는 게 아니기 때문에 굳이 catch나 throws를 사용하지 않도록 만들어져있습니다.

 

예외처리 방법

예외 복구

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

여기서 돌려놓는 방법이란 만약 IOException 에러 메시지가 사용자에게 그냥 던져지는 것을 의미하는 것이 아닙니다.

예외가 처리됐으면 비록 기능적으로는 사용자에게 예외상황으로 비쳐도 애플리케이션에서는 정상적으로 설계된 흐름을 따라 진행돼야 합니다.

복구 방법 중 하나로는 네트워크 접속이 원할하지 않을 때 일정 시간을 대기 한 후 다시 시도해보는 방법이 있습니다.

물론 최대 요청 횟수를 정해놓아야 합니다.

예외처리 회피

예외처리를 자신이 담당하지 않고 자신을 호출한 쪽으로 던져버리는 것입니다.

throws 문으로 선언해서 예외가 발생하면 알아서 던져지게 하거나 catch 문으로 일단 예외를 잡은 후에 로그를 남기고 다시 예외를 던지는 것입니다.

예외 전환

예외 회피와 비슷하게 예외를 복구해서 정상적인 상태로 만들 수 없기 때문에 예외를 메소드 밖으로 던집니다.

하지만 예외 회피와 달리, 발생한 예외를 그대로 넘기는 게 아니라 적절한 예외로 전환해서 던진다는 특징이 있습니다.

여기서 보통 전환하는 예외에 원래 발생한 예외를 담아서 중첩 예외로 만드는 것이 좋습니다.

 

이번 장에서는 예외를 처리하는 방법에 대해서 알아보았습니다.