참고포스팅 | https://hongs-coding.tistory.com/118
@controller, @restcontroller에서 발생한 예외를 한 클래스에서 모두 관리하고 처리할 수 있게 해주는 어노테이션입니다.
@ExceptionHandler는 @controller, @restController가 적용된 Bean내에서 발생하는 예외를 하나의 메서드에서 처리해주는 어노테이션입니다.
@controllerAdvice 내에서 exception처리를 해주는 메서드에 부착해서 사용합니다.
ControllerAdvice에서 기능별 예외들을 만들 땐 runtimeException을 상속하는 CustomException 클래스를 생성해 이 클래스를 상속받는 여러 종류의 Exception클래스를 만들어 사용할 수 있습니다.
error message를 담아서 꺼낼 수 있다.(e.getMessage 메소드)
생성해놓은 ContollerAdvice에서 exceptionhadler메소드를 만들어 오류 처리를 하면 되는데 @ExceptionHandler(Exception.class)를 메소드에 붙이면 해당 예외를 처리할 수 있다. 이때 .class를 붙여야 값으로 인식하기 때문에 이 점을 유의하자.
404는 다른 예외처리와 다르게 application.properties에 별도의 설정이 필요하다.
application.properties
// 사실 이것만 써도 404에러를 캐치해낸다.
spring.mvc.throw-exception-if-no-handler-found=true
// 이걸 쓰면 include File을 적용한 파일에 css가 오류가 생김
// 하지만 참고 포스팅에선 이것도 설정에 넣어줌.
spring.web.resources.add-mappings=false
404 이외에 다른 데이터베이스나 서버오류(500)처리 핸들러예시도 넣어놓았다.
@ControllerAdvice
public class ExceptionHandlerControllerAdvice {
// 404예외처리 핸들러
@ExceptionHandler(NoHandlerFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
public String handle404(NoHandlerFoundException e){
return "error/notFound";
}
// 데이터베이스오류
@ExceptionHandler(DataAccessException.class)
public String handleDataAccessException(DataAccessException e) {
e.printStackTrace();
return "error/databaseError";
}
// 500에러처리
@ExceptionHandler(Exception.class)
public String handleException(Exception e) {
e.printStackTrace();
return "error/serverError";
}
}
아래는 추가적 설명임으로 위의 설명이 어려울 시 참고
@ExceptionHandler(예외클래스명.class)
public String handle예외클래스명(예외클래스 e) {
return "오류정보를 표시하는 jsp 페이지 경로";
}
@ExceptionHandler(예외클래스명.class)
public @ResponseBody ResponseDto<?> handle예외클래스명(예외클래스 e) {
ReponseDto<?> response = new Response<>();
response.setStatus("FAIL");
response.setMessage(e.getMessage);
return response;
}
위의 예외처리 메소드는 {"status":"FAIL", "error":"오류 메세지 내용", "items":null}을 응답으로 보낸다.