토비의 스프링 책 스터디를 하면서 예외처리 주제로 읽었는데, 체크 예외(Checked Exception)와 언체크 예외(UnChecked Exception)에 대해 공부했다.
책 내에도 자세하게 나와있지만, 조금 더 정리해보고 싶어 블로그를 적게됐다.
예외(Exception)은 프로그램 실행 도중 발생할 수 있는 예상치 못한 상황을 의미한다.
자바에서는 Throwable
을 최상위 클래스로, Error
와 Exception
으로 나뉘며, 우리는 주로 Exception
을 다룬다.
try-catch
문이나 throws
키워드를 사용해야 하며 그렇지 않으면 컴파일 에러가 발생한다.public void readFile() throws IOException {
FileReader fr = new FileReader("test.txt"); // IOException 발생 가능
}
IOEXception
SQLException
ParseException
public int divide(int a, int b) {
return a / b; // b가 0이면 ArithmeticException 발생
}
NullPointerException
IllegalArgumentException
ArithmeticException
IndexOutOfBoundsException
스프링에서는 체크 예외보단 언체크 예외(RuntimeException 계열)을 권장한다.
throws
나 try-catch
를 강제하지 않아 코드 복잡도가 감소한다.@ControllerAdvice
, @ExceptionHandler
같은 전역 예외 처리 기능과 궁합이 좋다.public class InsufficientBalanceException extends RuntimeException {
public InsufficientBalanceException(String message) {
super(message);
}
}
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(InsufficientBalanceException.class)
public ResponseEntity<String> handleInsufficientBalance(InsufficientBalanceException e) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(e.getMessage());
}
}
구분 | Checked Exception | UnChecked Exception |
---|---|---|
처리 강제 여부 | O (컴파일 타임) | X (런타임) |
복구 가능성 | 복구 가능 | 복구 어려움 |
주요 발생 상황 | 외부 환경 문제(파일, DB, 네트워크) | 개발 실수, 논리 오류, 비정상 상황 |
스프링 권장 방식 | 가급적 사용 지양 | RuntimeException 상속하여 사용 |