자바에서는 예외(Exception)를 클래스 형태로 정의해두었으며, 크게 체크 예외와 언체크 예외로 나뉜다.
Exception을 상속받은 예외 중 RuntimeException을 제외한 모든 예외이다.RuntimeException과 그 하위 예외이다.예외를 메서드 내부에서 직접 처리하지 않고 상위 계층으로 책임을 넘기고 싶을 때,
메서드 선언부에 throws 예외클래스명 을 명시한다.
public void connect() throws IOException {
// 예외 발생 가능 코드
}
| 구분 | 체크 예외 | 언체크 예외 |
|---|---|---|
| 정의 | Exception 중 RuntimeException 제외한 예외 | RuntimeException 및 하위 예외 |
| 처리 필요 | 반드시 처리해야 함 (컴파일 시 검사) | 선택적으로 처리 가능 (컴파일러 검사 없음) |
| 예시 | IOException, SQLException | NullPointerException, IllegalArgumentException |
| 사용 예 | 통신 장애, 파일 없음 등 서버가 복구 시도 가능 | 잘못된 입력, 인가 실패 등 클라이언트 오류 |
서버에서 즉시 처리가 가능한가?
→ 가능하면 체크 예외, 불가능하면 언체크 예외
예외가 복구 가능성이 있는가?
→ 재시도가 가능하거나, 서버에서 처리 경로가 존재하면 체크 예외 사용
예외가 발생했을 때 사용자 잘못인가?
→ 클라이언트 실수로 발생하는 예외는 언체크 예외로 처리
Spring에서는 @ControllerAdvice를 통해
애플리케이션 전역의 예외를 하나의 클래스에서 처리할 수 있다.
이를 통해 컨트롤러 단에서 발생하는 예외를 일괄적으로 핸들링할 수 있으며,
@ExceptionHandler와 함께 사용하여 다양한 예외에 따른 응답을 설정할 수 있다.
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(MethodArgumentTypeMismatchException.class)
public ResponseEntity<String> handleTypeMismatch(MethodArgumentTypeMismatchException ex) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST)
.body("파라미터 타입이 올바르지 않습니다.");
}
@ExceptionHandler(HttpMessageNotReadableException.class)
public ResponseEntity<String> handleUnreadable(HttpMessageNotReadableException ex) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST)
.body("요청 본문을 읽을 수 없습니다.");
}
// 기타 예외 처리 추가 가능
}
자바 예외는 복구 가능성, 처리 주체, 즉시 대응 가능성에 따라
체크 예외와 언체크 예외를 구분해서 사용해야 한다.
서버에서 복구가 가능하거나 예외를 컨트롤할 수 있다면 체크 예외,
복구 불가능하거나 사용자의 잘못으로 발생한 경우는 언체크 예외가 적절하다.
스프링에서는 @ControllerAdvice를 활용해 전역 예외를 효율적으로 관리할 수 있으며,
코드 중복을 줄이고 일관된 에러 응답 포맷을 제공할 수 있다.
실무에서는 도메인마다 커스텀 예외 클래스를 만들어
에러 코드, 상태 코드, 에러 메시지 등을 체계적으로 관리하는 것이 중요하다.