토비의 스프링 스터디를 진행하며 4장에서 더 알아보고 싶은 내용으로 위와 같은 주제를 정했다.
이제부터 자세히 알아보자!
SpringBoot에서 예외처리를 하는 방식
doDispatch 메소드 내부에서 try/catch를 통해 예외처리를 하고 있음
이후 processDispatchResult에서 Dispatch 결과 처리
public class DispatcherServlet {
protected void doDispatch(...) throws Exception {
// ...
try {
ModelAndView mv = null;
Exception dispatchException = null;
try {
// Controller 로직 실행 (핸들러를 찾고, 해당 로직을 실행)
} catch (Exception ex) {
dispatchException = ex;
}
// Dispatch 결과 처리 (예외 처리도 여기서 진행)
processDispatchResult(...,dispatchException);
} catch {...}
// ...
}
}
@controller
에 @ExceptionHandler
정의
@ExceptionHandler(value = IllegalArgumentException.class)
public ResponseEntity<ErrorResponse> handleIllegalArgumentException(IllegalArgumentException e) {
ErrorResponse errorResponse = new ErrorResponse(e.getMessage());
return new ResponseEntity<>(errorResponse, HttpStatus.BAD_REQUEST);
}
@ControllerAdvice
/ @RestControllerAdvice
에 @ExceptionHandler
정의
AnnotationMethodHandlerExceptionResolver
@ExceptionHandler
어노테이션을 찾아 예외처리ResponseStatusExceptionResolver
@GetMapping(value = "/{id}")
public Foo findById(@PathVariable("id") Long id, HttpServletResponse response) {
try {
Foo resourceById = RestPreconditions.checkFound(service.findOne(id));
eventPublisher.publishEvent(new SingleResourceRetrievedEvent(this, response));
return resourceById;
}
catch (MyResourceNotFoundException exc) {
throw new ResponseStatusException(
HttpStatus.NOT_FOUND, "Foo Not Found", exc);
}
}
@ResponseStatus
를 붙이는 방식으로 구현@ExceptionHandler
위에도 붙일 수 있다DefaultHandlerExceptionResolver
@ControllerAdvice
는 Handler(Controller) 단에서 발생하는 Exception을 @ExceptionHandler
어노테이션으로 처리하는 로직이라 ExceptionHandling 불가@ExceptionHandler
@RestControllerAdvice
@RestControllerAdvice
@RestControllerAdvice
= @ControllerAdivce
+ @ResponseBody
@RestControllerAdvice
이 사용됨