Back-end/Spring

SpringBoot - MVC ExceptionHandler

Tigger 2020. 6. 27. 23:51

ExceptionHandler

기본적으로 등록되어있는 ErrorHandler가 메시지를 출력해주지만 직접 커스텀하여 에러 메시지를 출력할 수도 있습니다.

ExceptionHandler

위 사진이 기본적으로 등록된 에러 메시지입니다.

ExceptionHandler

curl 명령어로 보면 JSON 형식으로 오류가 나는 것을 확인 가능합니다.

  • BasicErrorController : 기본 예외 처리를 합니다.

핸들러 실습 해보기

Controller 클래스

@Controller
public class SampleController {

    @GetMapping("/hello")
    public String hello() {
        throw new SampleException();
    }
}

 

ExceptionHandler

먼저 Hello 요청을 보낼 때 SampleException 클래스를 통해 에러메시지를 출력하기 위해 에러를 던집니다.

SampleException 클래스

ExceptionHandler

RuntimeException을 상속받아 실행시 에러를 발생시키도록 합니다.

AppError 클래스

public class AppError {

    private String message;

    private String reason;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public String getReason() {
        return reason;
    }

    public void setReason(String reason) {
        this.reason = reason;
    }
}

 

ExceptionHandler

메시지와 에러 이유를 나타낼 수 있도록 변수 및 getter, setter를 선언합니다.

Controller 클래스

@Controller
public class SampleController {

    @GetMapping("/hello")
    public String hello() {
        throw new SampleException();
    }


    // 메소드 파라미터로 해당하는 Exception 정보를 받아 올 수 있습니다.
    @ExceptionHandler(SampleException.class)
    public @ResponseBody AppError sampleError(SampleException e) {
    // AppError: App에서 만든 커스텀한 에러정보를 담고 있는 클래스를 생성합니다.
        AppError appError = new AppError();
        appError.setMessage("error.app.time");
        appError.setReason("timeOut");
        return appError;
    }
}

 

ExceptionHandler

@ExceptionHandler를 활용하여 RuntimeException시 발생하는 에러를 커스텀 하기 위해 선언을 해줍니다.
그리고 AppError클래스의 메시지, 에러이유를 정의해주고 return합니다.

ExceptionHandler

/hello 경로 이동시 직접 선언했던 에러 메시지가 출력됩니다.

에러 페이지 커스텀하기

  • 참고 : 스프링공식문서
  • 경로 : src/main/resources/static/error/
  • 경로에 상태코드와 동일한 에러페이지를 만들어야 동작합니다. 혹은 첫 번째 숫자만 명시합니다.
  • 404.html
  • 5xx.html
  • ErrorViewResolver 구현

ExceptionHandler

경로에 404에러 및 5xx에러 발생시 나타내는 페이지를 커스텀 합니다.

ExceptionHandler

Root로 접근했을 경우 따로 페이지가 없기 때문에 404에러가 발생하여 커스텀한 페이지가 출력된 것을 확인할 수 있습니다.