-
@ControllerAdvice, @ExceptionHanlderSpring 2023. 3. 18. 17:36
ExceptionHandler 어노테이션은 Controller와 RestController 클래스에서 발생한 예외를 별도의 메소드를 custom으로 생성해서 처리해준다.
쉽게 설명하자면 Controller 클래스에서 발생하는 예외 처리는 필드가 많아질 수록 복잡해진다.
BindingResult result if(result.hasError()){ List<FieldError> fieldErros = result.getFieldErrors(); FieldError fieldError = fieldErrors.get(0); String fieldName = fieldError.getField(); String ErrorMessage = fieldError.getDefaultMessage(); Map<String, String> error = new HashMap<>(); error.put(fieldName, fieldMessage); }
위와 같은 코드를 모든 메서드에서 선언해주는건 무리가 있다.
이런 예외 처리 반복같은 중노동을 방지해주는 기능을 ExceptionHandler에서 제공해준다.
ExceptionHandelr(value)에 들어가는 value 값은 어떤 예외를 잡을 것인지 특정 지어줄 수 있다.
만약 value 값을 선언하지 않는다면 모든 에러를 다 잡을 것이다.
@ExceptionHandler(MethodArgumentNotValidException.class)
@ControllerAdvice에 특정 컨트롤러 클래스를 지정하지 않으면 @Controller가 선언된 모든 클래스의 예외처리를 맡아준다.
@ControllerAdvice 안에 @ExceptionHandler가 포함되어 있다.
@ControllerAdvice @Slf4j public class ExceptionController { @ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler(MethodArgumentNotValidException.class) @ResponseBody // json 형태로 예외 처리를 해주고 싶기 때문에 추가.(삭제 시 ViewResolver 오류) public ErrorResponse inValidRequestHandler(MethodArgumentNotValidException e){ ErrorResponse response = ErrorResponse.builder() .code("400") .message("잘못된 요청입니다.") .build(); for(FieldError fieldError : e.getFieldErrors()){ response.addValidation(fieldError.getField(), fieldError.getDefaultMessage()); } return response; } }
위 코드는 @ControllerAdvice를 적용한 클래스
'Spring' 카테고리의 다른 글
@ResponsBody (0) 2023.03.18 Controller, ResController 차이 (0) 2023.03.18 @RequestParam 생략 가능 (0) 2023.03.17 AnnotationProcessor (0) 2023.03.15 @PathVariable (0) 2023.01.30