백엔드/SpringBoot

[ 스프링부트 / SpringBoot] Exception 처리

첫번째 방식, Global(전역)처리 방식

1. Global(전역)처리 방식 - @RestControllerAdvice (rest), @ControllerAdvice (view)

  - 화면을 리턴하지 않고 Rest방식으로 사용할 경우 @RestControllerAdvice,
    화면(jsp, html)을 리턴하는 @ControllerAdvice를 사용하면 된다.

  - basePackages 속성을 지정하면, 해당 패키지 내에서만 Exception 처리가 가능하다.

  - basePackageClasses 속성을 지정하면, 해당 클래스 내에서만 Exception 처리가 가능하다.

  - @ExceptionHandler에 value를 통해 어떤 Exception을 처리할 것인지 지정할 수 있다.

@RestControllerAdvice(basePackages = "com.example")
public class GlobalControllerAdvice {
    @ExceptionHandler(value = Exception.class)
    public ResponseEntity exception(Exception e){
        System.out.println(e.getClass().getName());
        System.out.println("-------------------------------");
        System.out.println(e.getLocalizedMessage());
        System.out.println("-------------------------------");

        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("");
    }

    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public ResponseEntity methodArgumentNotValidException(MethodArgumentNotValidException e){
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(e.getMessage());
    }
}

 

2. Class 내에 @ExceptionHandler 지정 방식

  - @ExceptionHandler은 @RestControllerAdvice (rest),@ControllerAdvice (view) 필요 조건이 아니다.

  - 해당 Class 안에서만 처리할 Exception이 있는 경우 사용하면 된다.

@RestController
@RequestMapping("/api/user")
public class ApiController {
    
    ...
    
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public ResponseEntity methodArgumentNotValidException(MethodArgumentNotValidException e){
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(e.getMessage());
    }
}

우선순위는 Global(전역) < Class이므로, 전역으로 지정해도 Class내부에 처리가 있다면 Class를 따라간다!