본문 바로가기
Develop/Spring

[Spring Web MVC] Exceptions - @ExceptionHandler

by 준팍(junpak) 2023. 4. 17.

@ExceptionHandler

@Controller
public class MyController {

    @GetMapping("/example")
    public String exampleMethod() {
        // 여기에 코드 작성
        throw new CustomException("사용자 정의 예외입니다");
    }

    @ExceptionHandler(CustomException.class)
    public ResponseEntity<String> handleCustomException(CustomException ex) {
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ex.getMessage());
    }
}
  • ExceptionHandlerExceptionResolver
    • 스프링 기본 제공
    • 기본 제공 ExceptionResolver 중에 우선 순위가 가장 높다.
  • 컨트롤러 메서드의 실행 중 발생하는 특정 예외를 처리할 컨트롤러 클래스 내의 메서드를 정의하는 데 사용
  • 사용법
    • @ExceptionHandler 선언
    • 해당 컨트롤러에서 처리하고 싶은 예외 지정
    • 해당 컨트롤러에서 예외 발생 시, @ExceptionHandler이 선언된 메서드 호출
    • 지정한 예외 및 그 예외의 자식 클래스를 모두 잡는다.
  • 우선 순위
    • 스프링의 우선순위는 항상 자세한 것이 우선권을 가진다.
    • 자식 예외가 발생할 경우, 부모 예외처리()자식 예외처리()자식 예외처리() 호출
    • 부모 예외가 발생할 경우, 부모 예외처리()만 호출 대상이 되므로 부모 예외처리() 호출
  • 예외 생략
    • @ExceptionHandler의 예외 생략 시, 메서드 파라미터의 예외 지정
// UserException 예외를 처리한다.

@ExceptionHandler
  public ResponseEntity<ErrorResult> userExHandle(UserException e) {}
  • 다양한 예외 유형 처리
    • @ExceptionHandler에 배열로 제공
@Controller
public class MyController {

    @GetMapping("/example1")
    public String exampleMethod1() { // 사용자 정의 예외 'CustomException1'을 발생시키는 메서드
        // Your code here
        throw new CustomException1("This is a custom exception 1");
    }

    @GetMapping("/example2")
    public String exampleMethod2() { // 사용자 정의 예외 'CustomException2'을 발생시키는 메서드
        // Your code here
        throw new CustomException2("This is a custom exception 2");
    }

    @ExceptionHandler({CustomException1.class, CustomException2.class})
    public ResponseEntity<String> handleMultipleExceptions(Exception ex) {
				// 두 가지 예외 유형을 모두 처리하고 HTTP 응답을 반환
				// 상태는 400 Bad Request이며, 각각의 예외 메시지를 본문에 포함
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ex.getMessage());
    }
}

 

  • @RequestMapping 메소드와 같은 방식으로 method arguments 사용 가능
    • @RequestParam, @PathVariable, @RequestHeader
    • request body가 이미 소비된 경우
      • 예외가 발생한 시점에 이미 요청이 처리되어 버퍼에서 읽혀져 소비된 경우
      • 요청 본문과 관련된 메소드 인자 사용 불가
  • @RequestMapping 메소드와 같은 방식으로 return Values 사용 가능
    • ResponseEntity, Model, ModelAndView 등 반환