Home Exception
Post
Cancel

Exception

Exception

  • Web Application의 입장에서 바라 보았을 때, 에러가 발생했을 경우 내려줄 수 있는 방법이 많지 않다.
    1. Error Page
    2. 4XX Error or 5XX Error
    3. 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
This post is licensed under CC BY 4.0 by the author.