Home Spring: ControllerAdvice, ExceptionHandler를 활용한 예외처리
Post
Cancel

Spring: ControllerAdvice, ExceptionHandler를 활용한 예외처리

Spring error handling 기본

따로 예외처리를 구현하지 않았을 때, Spring servlet 내부에서 발생한 예외가 servlet container까지 전파되며 servlet container에서는 BasicErrorController 를 통해 예외처리를 진행한다.

application config값에 따라 노출하는 내용, 에러 페이지등을 다르게 설정 가능하다.

@ControllerAdvice

Spring component annotation이며 기본적으로 global-scope에서 발생하는 exception에 대한 예외처리를 제공해주며. basePackage 인자를통해 scope를 별도로 지정 할 수 있다.

1
@ControllerAdvice(basePackages = ...)

Spring-mvc에서는 ResponseEntityExceptionHandler를 상속하여 함수 오버라이딩을 통해 보다 편리하게 전역적인 ControllerAdvice를 작성 할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
@ControllerAdvice
public class GlobalErrorHandler extends ResponseEntityExceptionHandler {
  @Override
  protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
        ...
  }

  @Override
  protected ResponseEntity<Object> handleTypeMismatch(TypeMismatchException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
        ...
  }
}

@ExceptionHandler

Component 단위로 함수의 ExceptionHandler annotation확인하여 해당 Component 영역에서의 예외처리기능을 제공

ControllerAdvice - servlet scope

1
2
3
4
5
6
7
@ControllerAdvice
public class GlobalErrorHandler {
	@ExceptionHandler(ContraintViolationException.class)
	public void handleConstraintViolationException(ConstraintViolationException e, ServletWebRequest webRequest) {
		...
	}
}

Controller - controller scope

1
2
3
4
5
6
7
8
@RestController
public class LoginController {
	...
	@ExceptionHandler(LoginException.class)
	public void handleException(LoginException e, ...) {
		...
	}
}

결론

전역적으로 사용하는 Exception의 경우 ControllerAdvice를 통해 처리하고

Controller scope에서 발생하는 ControllerScopedCustomException의 경우 Controller 내부에서 ExceptionHandler를 활용하여 처리한다.

This post is licensed under CC BY 4.0 by the author.

Spring: jackson InvalidDefinitionException

Ioc, DI, DIP: 그놈이 그놈이아니다.