
컨트롤러에서 예외가 발생하였을때 적절히 예외처리를 해주는 역할을 한다.
어노테이션 @RequestMapping이 달린 메서드 실행 중 발생한 예외를 가로채는 exceptions interceptor이다.
애플리케이션 내 모든 컨트롤러에서 발생하는 예외를 처리할 수 있다. WebControllerAdvice를 사용하면 컨트롤러는에서의 코드 중복을 피할 수 있다. 그래서 컨트롤러는 컨트롤러 역할만 집중하면 되고 예외 처리의 경우 다른 곳에서 처리하도록 분리할 수 있다.
먼저 저는 RestController를 사용하여서 @RestControllerAdvice 를 사용하였습니다.
@RestControllerAdvice
public class WebControllerAdvice {
/**
* NOT_FOUND 처리 메소드
*
* @return ApiResponse<ErrorResponseForm>
*
*/
@ExceptionHandler({
FileNotFoundException.class
})
@ResponseStatus(HttpStatus.NOT_FOUND)
public ApiResponse<ErrorResponseForm> notFoundHandler(Exception ex, Model model) {
return ApiResponse.notFoundFail(
ErrorResponseForm.builder()
.title(ex.getMessage())
.status(HttpStatus.NOT_FOUND.value())
.timestamp(ZonedDateTime.now().toString())
.build()
);
}
}
제 코드에서 만약 FileNotFoundException예외가 발생했을 경우 RestController의 return 값이 기존의 값이 아닌 ApiResponse 값으로 return 하게 됩니다. 그래서 그거에 관련된 내용을 반환시키기 위해 코드를 작성하였습니다.
- class에 @RestControllerAdvice를 추가
- @ExceptionHandler안에 처리할 예외들을 작성
- @ResponseStatus를 통해 반환할 HttpStatus를 설정합니다.
- 그리고 반환할 값을 설정한 후 작성합니다.