Exception
- Web Application의 입장에서 바라 보았을 때, 에러가 발생했을 경우 내려줄 수 있는 방법이 많지 않다.
- Error Page
- 4XX Error or 5XX Error
- Client가 200외에 처리를 하지 못 할 때는 200을 내려주고 별도의 에러 Message를 전달
@(Rest)ControllerAdvice
- 기본적으로 Spring 예외 처리를 해주지만 클라이언트에게 최소한의 정보만 보내게 된다. ControllerAdvice를 사용해 예외처리를 Custom할 수 있다.
- 모든 컨트롤러에 예외 처리, 바인딩 설정등을 적용하고 싶은 경우에 사용한다.
- @ExceptionHandler를 함께 사용해 모든 컨트롤러 전반에 걸친 예외처리가 가능하다.
- 예외처리 뿐만 아니라 @InitBinder, @ModelAttribute와 함께 사용하는 것으로 바인딩 또는 검증 설정, 모델 정보 초기화를 할 수 있다.
1
2
3
4
5
6
7
8
@RestControllerAdvice
public class GlobalControllerAdvice {
@ExceptionHandler(value = Exception.class) // 모든 예외를 처리
public ResponseEntity exception(Exception e){
System.out.println(e.getLocalizedMessage());
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("");
}
}
특정 예외 처리
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@RestControllerAdvice
public class GlobalControllerAdvice {
@ExceptionHandler(value = Exception.class)
public ResponseEntity exception(Exception e){
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());
}
}
Advice 적용 범위 설정
1 컨트롤러 클래스로 설정
1
@RestControllerAdvice(assignableTypes = {testController.class, exampleController.class})
- 해당 컨트롤러 클래스에만 적용한다.
2 어노테이션으로 설정
1
@RestControllerAdvice(annotations = Controller.class)
- @Controller에만 적용한다.
3 패키지로 설정
1
2
@RestControllerAdvice(basePackages = "com.example.exception.controller")
- com.example.exception.controller패키지 하위에 적용
예외처리 우선순위
- 글로벌 하게 작성하지 않고 Controller에 직접 @ExceptionHandler(value = MethodArgumentNotValidException.class)를 작성하면 해당 Controller의 예외는 해당 메서드에서 처리된다.
- 우선순위 : default < 특정 Controller내부의 Handler < Golbal Handler