728x90
@ExceptionHandler를 사용해서 예외를 깔끔하게 처리할 수 있게 되었지만, 정상 코드와 예외 처리 코드가 하나의 컨트롤러에 섞여 있다. @ControllerAdvice 또는 @RestControllerAdvice를 사용하면 둘을 분리할 수 있다
@Slf4j
@RestControllerAdvice(basePackages = "hello.exception.api")
public class ExControllerAdvice {
@ResponseStatus(HttpStatus.BAD_REQUEST) //해당 어노테이션을 붙여서 상태코드를 원하는 값으로 반환해 줄수 있다
@ExceptionHandler(IllegalArgumentException.class)
public ErrorResult illegalException(IllegalArgumentException e) {
//ExceptionHandlerExceptionResolver가 컨트롤러를 뒤져 해당 어노테이션이 있는지를 찾아서 해당 메소드를 호출해 준다.
log.error("[exceptionHandler] ex", e);
//해당 흐름을 찾아 정상 흐름으로 반환해 준다 -> 200 이 반환 된다.
return new ErrorResult("BAD", e.getMessage());
}
@ExceptionHandler
public ResponseEntity<ErrorResult> userExHandler(UserException e) { //똑같을 경우 어노테이션 속성값 생략가능
log.error("[exceptionHandler] ex", e);
ErrorResult errorResult = new ErrorResult("USER-EX", e.getMessage());
return new ResponseEntity(errorResult, HttpStatus.BAD_REQUEST);
}
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ExceptionHandler
public ErrorResult exHandler(
Exception e) { //자식 에외를 모두 잡기 때문에 Exception을 잡게된다면 잡지않은 공통의 예외를 모두 잡아준다
log.error("[exceptionHandler] ex", e);
return new ErrorResult("EX", "내부 오류");
}
}
- @ControllerAdvice
- @ControllerAdvice 는 대상으로 지정한 여러 컨트롤러에 @ExceptionHandler , @InitBinder 기능을 부여해주는 역할을 한다.
- @ControllerAdvice에 대상을 지정하지 않으면 모든 컨트롤러에 적용된다. (글로벌 적용)
- @RestControllerAdvice는 @ControllerAdvice와 같고, @ResponseBody 가 추가되어 있다. (@Controller , @RestController 의 차이와 같다.)
- 대상 컨트롤러 지정 방법
- annotation, package, assignableTypes 을 지정할 수 있다.
- https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-anncontroller-advice
Web on Servlet Stack
This part of the reference documentation covers support for Servlet stack, WebSocket messaging that includes raw WebSocket interactions, WebSocket emulation through SockJS, and publish-subscribe messaging through STOMP as a sub-protocol over WebSocket. 4.1
docs.spring.io
728x90
'스프링 MVC 2편(백엔드 웹 개발 활용 기술)' 카테고리의 다른 글
| Ch10. 스프링 타입 컨버터 소개 - 컨버전 서비스(ConversionService) (0) | 2022.03.22 |
|---|---|
| Ch10. 스프링 타입 컨버터 소개 - 스프링 타입 컨버터 (0) | 2022.03.22 |
| Ch09. API 예외 처리 - 스프링이 제공하는 ExceptionResolver (0) | 2022.03.21 |
| Ch09. API 예외 처리 - HandlerExceptionResolver (0) | 2022.03.21 |
| Ch09. API 예외 처리 - 스프링 부트 기본 오류 처리 (0) | 2022.03.21 |