예외 처리가 생겨나게 된 이유
현대의 서비스들은 외부 서버와의 연결, 네트워크 통신 등 많은 부분들을 서로 연계하여 만들어진다. 그로인해 발생되는 많은 예외들을 어떻게 처리해야 할 것인가는 매우 중요하다.
예외 처리 기법이 생겨나기 전의 처리
-
반환 값으로 예외 처리 오류가 발생했을 때 직접 값을 반환해 처리하는 방식 ex) “success”, “false”
⇒ 해당 방식은 수많은 수많은 if문들의 중첩으로 정상 흐름과 예외흐름이 겹쳐 있어, 중요한 정상 흐름을 알아보기가 쉽지 않다.
예외 계층
자바는 예외를 처리하기 위한 매커니즘을 제공한다.
- keyword : try, catch, finally, throw, throws
체크 예외와 언체크 예외의 분기
예외는 폭탄과 같고 잡아서 처리하거나 계속 던져버려야 한다.
- 체크 예외 (Exception)
- 잡아서 처리하는 경우 ( throw - 생략 X ) 장점 - 개발자가 누락하지 않고 어디서 예외가 발생하는지 파악하기 쉬움 - 컴파일러가 누락된 부분을 잡아줄 수 있음 단점 - 모든 예외를 반드시 처리해야 하기 때문에 너무 번거로워 진다.
- 언체크 예외 (RuntimeException)
-
던져서 처리하는 경우 ( throws - 생략 O )
-
상위로 계속 폭탄을 던져냄 장점 - 신경쓰고 싶지 않은 예외는 무시가능 단점 - 실수로 예외를 누락할 확률이 있다.
-
예외의 계층화

예외를 단순히 코드를 분리해 처리하는 것이 아닌, 계층화 하여 더 세밀하게 예외를 분류하고 처리할 수 있다.
바람직한 예외 처리와 실무
- 정상 흐름과 예외 흐름을 나눈다.
- 반드시 실행되어야하는 로직 수행 가능
- 리소스 반납
모든 예외를 체크로 처리할 경우 예외 처리 지옥에 빠질 가능성이 농후하다.

또한, 예외를 잡아서 복구할 수 있는 예외보다 복구할 수 없는 예외가 더 많다.
⇒ 매우 중요한 쪽은 체크 예외로 처리하고, 대부분은 언체크 예외로 둔다.
예외를 공통으로 처리하는 것이 바람직한 방향
⇒ 세부 로직에선 언체크로 수행하고, 서비스 메인단에서 오류를 받아서 처리한다.
ex) main 메서드에서 ExceptionHandler를 이용하여 오류를 한꺼번에 받고, 필요한 오류들만 별도로 처리하는 방식
try-with-resources
AutoCloseable ( Interface )를 구현하면 try 가 끝나는 시점에 close()를 자동으로 실행한다.
public interface AutoCloseable {
void close() throws Exception;
}구문
try (Resource resource = new Resource()) {
// 리소스를 사용하는 코드
}- finally 보다도 더 빨리 실행