운영 환경에서 발생하는 예외를 부적절하게 처리하면 문제의 원인을 찾기 힘들어집니다. 모든 예외는 적절하게 복구되거나 작업을 중단하고 관리자나 개발자에게 통보되어야 합니다. 예를 들어, 네트워크가 끊기거나 서버가 종료된 상황에서 예외를 단순히 콘솔에 출력하는 것으로는 문제가 해결되지 않습니다. 콘솔 출력은 실제 문제 해결에 도움이 되지 않으므로, 차라리 서버를 종료시키는 것이 더 나은 선택일 수 있습니다.
무의미하고 무책임한 throws는 피하자
개발자가 복구할 수 있는 예외 상황에도 불구하고, 무책임하게 throws를 사용하여 예외를 상위로 던지는 것은 적절하지 않습니다. 이러한 예외 처리 방식은 실제로 예외를 다룰 수 있는 기회를 빼앗기 때문에, 예외 처리 전략을 신중하게 선택해야 합니다.
예외 처리의 기본 개념
자바에서 예외는 크게 세 가지로 나눌 수 있습니다.
- Error: 시스템에서 비정상적인 상황이 발생했을 때 JVM에서 발생시키는 예외입니다. 이는 애플리케이션 코드에서 잡으려고 시도해서는 안 됩니다. OutOfMemoryError와 같은 에러는 애플리케이션 레벨에서 복구가 불가능합니다.
- Exception (Checked Exception): 애플리케이션 코드에서 발생하는 예외로, 명시적인 처리가 필요합니다. Exception 클래스의 서브클래스이면서 RuntimeException을 상속하지 않은 예외를 체크 예외라고 합니다.
- RuntimeException (Unchecked Exception): 명시적인 예외 처리를 강제하지 않는 언체크 예외입니다. 이는 프로그램 오류를 피할 수 있도록 설계된 것으로, 예를 들어 NullPointerException, IllegalArgumentException과 같은 예외가 여기에 속합니다.
예외를 어떻게 다룰 것인가?
체크 예외 vs 언체크 예외
- 체크 예외: 발생할 가능성이 있는 예외를 반드시 처리하도록 강제합니다. 예외가 발생할 수 있는 메서드를 호출할 때 throws 또는 try-catch 블록을 사용해 처리해야 합니다.
- 언체크 예외: 개발자의 실수로 인해 발생할 수 있는 예외로, 명시적으로 처리할 필요는 없습니다. 다만, 프로그램의 예측 가능한 오류를 방지하기 위해 사전에 설계를 통해 문제를 해결할 수 있습니다.
예외 처리 방법
예외 복구
예외가 발생하더라도 정상 상태로 복구하는 것이 가능하다면 이를 시도해야 합니다. 예를 들어, 파일을 읽는 중에 IOException이 발생했다면, 사용자가 다른 파일을 선택하도록 유도하는 방법이 있습니다. 예외 발생 시 무조건 프로그램을 종료하는 대신, 재시도를 통해 문제를 해결하거나, 상황에 맞게 처리하는 것이 중요합니다.
예외 회피
예외를 자신이 처리하지 않고 호출한 메서드로 던져버리는 방식입니다. throws 키워드를 사용하거나, catch 블록에서 예외를 잡은 후 다시 던질 수 있습니다. 단, 예외를 던질 때에는 반드시 다른 객체나 메서드가 이 예외를 처리할 수 있도록 해야 합니다.
예외 전환
예외를 회피하는 것과 비슷하지만, 단순히 던지는 것이 아니라 의미 있는 예외로 변환하여 던지는 것을 말합니다. 예를 들어, DB에서 중복된 사용자를 추가하려고 할 때 SQLException이 발생하면, 이를 DuplicateUserIdException으로 변환하여 더 명확한 의미를 부여할 수 있습니다. 이를 통해 서비스 계층에서 예외 상황을 더 쉽게 파악하고 적절하게 처리할 수 있습니다.
최근 예외 처리 방법
최근 서버 환경에서는 체크 예외를 빠르게 런타임 예외로 전환하여 처리하는 경향이 있습니다. 런타임 예외는 예상하지 못했던 상황에서 발생하므로, 시스템 레벨에서 자동으로 처리되도록 설계하는 것이 일반적입니다.
낙관적 예외 처리 기법
복구할 수 없는 예외가 없다는 가정 하에, 예외가 발생하면 시스템 레벨에서 알아서 처리해줄 것이라고 믿고 개발하는 방식도 존재합니다. 예를 들어, 은행 계좌에서 출금하는 기능을 설계할 때, 출금 가능 여부를 확인하고 부족한 경우 InsufficientBalanceException을 던지도록 설계할 수 있습니다. 이를 통해 정상적인 흐름과 예외 상황을 명확하게 구분하고, 발생 가능한 예외 상황에 대해 사전에 대응할 수 있습니다.
'JAVA > Spring' 카테고리의 다른 글
[스프링 학습] 1. 오브젝트와 IoC (0) | 2023.10.23 |
---|---|
Spring Template - RestTemplate (0) | 2023.07.23 |
Spring Template이란? (0) | 2023.07.23 |
JWT Token (0) | 2023.07.23 |
HttpServletRequest와 @RequestBody (0) | 2023.07.23 |