프로그래밍/Spring Boot

[Spring] 예외 처리 ExceptionHandler

연유뿌린빙수 2024. 11. 29. 19:12

스프링에서 @ExceptionHandler는 애플리케이션에서 발생하는 특정 예외를 처리하기 위해 사용되는 애노테이션이다.

 

@ExceptionHandler는 주로 REST API를 개발할 때 유용하며, 사용자에게 친화적인 에러 메시지를 제공하거나 특정 HTTP 상태 코드를 반환하는 데 사용된다.

-> Response Body를 직접 설정 가능

 

 

 

기본 사용법

@ExceptionHandler는 컨트롤러 클래스나, 컨트롤러 계층 전반에서 예외를 처리하는 데 사용됩니다.

@RestController
@RequestMapping("/api")
public class SampleController {

    @GetMapping("/test")
    public String testEndpoint() {
        // 예외 발생
        throw new IllegalArgumentException("잘못된 입력입니다!");
    }

    // 예외 처리 메서드
    @ExceptionHandler(IllegalArgumentException.class)
    public ResponseEntity<String> handleIllegalArgumentException(IllegalArgumentException ex) {
        return new ResponseEntity<>("예외 발생: " + ex.getMessage(), HttpStatus.BAD_REQUEST);
    }
}

기능 설명

  1. 특정 예외 처리:
    • @ExceptionHandler는 특정 예외 클래스나 그 하위 클래스에서만 트리거됩니다.
    • 위의 예제에서는 IllegalArgumentException을 처리합니다.
  2. 다양한 반환값 지원:
    • 반환값으로 뷰 이름, 객체, 또는 ResponseEntity 등을 사용할 수 있습니다.
    • 주로 REST API에서는 ResponseEntity로 JSON 또는 문자열 응답을 반환합니다.
  3. 글로벌 예외 처리:
    • 개별 컨트롤러에서 관리하기 어려운 경우, 글로벌 예외 처리를 위한 @ControllerAdvice와 함께 사용합니다.

글로벌 예외 처리

@ControllerAdvice를 사용하면 모든 컨트롤러에서 발생하는 예외를 중앙에서 처리할 수 있습니다.

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(IllegalArgumentException.class)
    public ResponseEntity<String> handleIllegalArgumentException(IllegalArgumentException ex) {
        return new ResponseEntity<>("글로벌 처리: " + ex.getMessage(), HttpStatus.BAD_REQUEST);
    }

    @ExceptionHandler(Exception.class)
    public ResponseEntity<String> handleGeneralException(Exception ex) {
        return new ResponseEntity<>("알 수 없는 예외 발생: " + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

추가 기능

  1. 다중 예외 처리:
    • 하나의 메서드에서 여러 종류의 예외를 처리할 수 있습니다.
    @ExceptionHandler({IllegalArgumentException.class, NullPointerException.class})
    public ResponseEntity<String> handleMultipleExceptions(RuntimeException ex) {
        return new ResponseEntity<>("예외 발생: " + ex.getMessage(), HttpStatus.BAD_REQUEST);
    }
    
  2. HTTP 상태 코드 설정:
    • ResponseEntity를 사용하지 않고도 간단히 상태 코드를 변경하려면 @ResponseStatus를 활용할 수 있습니다.
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler(IllegalArgumentException.class)
    public String handleIllegalArgumentException(IllegalArgumentException ex) {
        return "잘못된 요청입니다: " + ex.getMessage();
    }
    
  3. 커스텀 에러 응답 구조:
    • 사용자 정의 예외 응답 객체를 반환하여 API의 일관성을 유지합니다.
    public class ErrorResponse {
        private String message;
        private int status;
    
        // 생성자 및 Getter/Setter
    }
    
    @ExceptionHandler(IllegalArgumentException.class)
    public ResponseEntity<ErrorResponse> handleIllegalArgumentException(IllegalArgumentException ex) {
        ErrorResponse errorResponse = new ErrorResponse("잘못된 요청입니다.", 400);
        return new ResponseEntity<>(errorResponse, HttpStatus.BAD_REQUEST);
    }
    

@ExceptionHandler를 적절히 활용하면 유지보수성이 높아지고, 예외 상황에서도 사용자 경험을 향상시킬 수 있습니다.