Spring 예외

김현찬·2025년 6월 5일

Java 예외 처리와 @ControllerAdvice를 통한 글로벌 예외 처리 전략


예외란?

자바에서는 예외(Exception)를 클래스 형태로 정의해두었으며, 크게 체크 예외언체크 예외로 나뉜다.

  • 체크 예외: Exception을 상속받은 예외 중 RuntimeException을 제외한 모든 예외이다.
  • 언체크 예외: RuntimeException과 그 하위 예외이다.

예외 전가 (throws)

예외를 메서드 내부에서 직접 처리하지 않고 상위 계층으로 책임을 넘기고 싶을 때,
메서드 선언부에 throws 예외클래스명 을 명시한다.

public void connect() throws IOException {
    // 예외 발생 가능 코드
}
구분체크 예외언체크 예외
정의ExceptionRuntimeException 제외한 예외RuntimeException 및 하위 예외
처리 필요반드시 처리해야 함 (컴파일 시 검사)선택적으로 처리 가능 (컴파일러 검사 없음)
예시IOException, SQLExceptionNullPointerException, IllegalArgumentException
사용 예통신 장애, 파일 없음 등 서버가 복구 시도 가능잘못된 입력, 인가 실패 등 클라이언트 오류

예외 선택 기준

  • 서버에서 즉시 처리가 가능한가?
    → 가능하면 체크 예외, 불가능하면 언체크 예외

  • 예외가 복구 가능성이 있는가?
    → 재시도가 가능하거나, 서버에서 처리 경로가 존재하면 체크 예외 사용

  • 예외가 발생했을 때 사용자 잘못인가?
    → 클라이언트 실수로 발생하는 예외는 언체크 예외로 처리


@ControllerAdvice란?

Spring에서는 @ControllerAdvice를 통해
애플리케이션 전역의 예외를 하나의 클래스에서 처리할 수 있다.

이를 통해 컨트롤러 단에서 발생하는 예외를 일괄적으로 핸들링할 수 있으며,
@ExceptionHandler와 함께 사용하여 다양한 예외에 따른 응답을 설정할 수 있다.


GlobalExceptionHandler 예시

@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를 활용해 전역 예외를 효율적으로 관리할 수 있으며,
    코드 중복을 줄이고 일관된 에러 응답 포맷을 제공할 수 있다.

  • 실무에서는 도메인마다 커스텀 예외 클래스를 만들어
    에러 코드, 상태 코드, 에러 메시지 등을 체계적으로 관리하는 것이 중요하다.

0개의 댓글