본문 바로가기
Java & 스프링/스프링부트 톺아보기

[spring] 스프링 부트의 ExceptionHandler

by hjhello423 2019. 12. 2.

BasicErrorController

 

BasicErrorController는 기본 에러 핸들러이다.

내용을 보면 아래와 같이 html과 json 형식으로 응답을 하는 것을 알 수 있다.

우리가 흔히 볼 수 있는 아래와 같은 웹서비스의 404 에러 페이지도 이 핸들러가 처리하는 것이다.

 

 

 

요청의 헤더에 'test/html' 정보가 담겨 있기 때문에 응답을 html 형식으로 하게 된다.

만약 curl을 이용해 아래와 같이 요청한다면 json 형태의 에러 응답을 하게 될 것이다.

curl http://127.0.0.1:8080/aa

 

<BasicErrorController.java>

@RequestMapping(produces = MediaType.TEXT_HTML_VALUE)
public ModelAndView errorHtml(HttpServletRequest request,
        HttpServletResponse response) {
    HttpStatus status = getStatus(request);
    Map<String, Object> model = Collections.unmodifiableMap(getErrorAttributes(
            request, isIncludeStackTrace(request, MediaType.TEXT_HTML)));
    response.setStatus(status.value());
    ModelAndView modelAndView = resolveErrorView(request, response, status, model);
    return (modelAndView != null) ? modelAndView : new ModelAndView("error", model);
}

@RequestMapping
public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
    Map<String, Object> body = getErrorAttributes(request,
            isIncludeStackTrace(request, MediaType.ALL));
    HttpStatus status = getStatus(request);
    return new ResponseEntity<>(body, status);

 

public static final String TEXT_HTML_VALUE = "text/html";

 


Exception 핸들러 생성

 

Exception을 처리하는 핸들러를 만들어 보자.

<SampleController.java>


@Controller
public class SampleController {

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

    @ExceptionHandler(SampleException.class)
    @ResponseBody
    public AppError responseError(SampleException e) {
        AppError appError = new AppError();
        appError.setMessage("error.app.key");
        appError.setReson("IDK IDK IDK");

        return appError;
    }
}

 

<AppError.java>


@Getter(AccessLevel.PUBLIC)
@Setter(AccessLevel.PUBLIC)
public class AppError {

    public String message;
    public String reson;
    
}

 

<SampleException.java>


public class SampleException extends RuntimeException {
}

 

 

 

 


커스텀 에러 페이지

 

에러가 났을 때 http status 코드에 따라 다른 페이지를 보여줄 수 있다.

에러 페이지를 resource 경로에서 생성해 보자.

커스텀 에러 페이지는 */error의 하위 경로에 있어야 한다.

 

파일 이름을 5xx, 4xx와 같이 지정할 경우 각각 500, 400번대의 에러를 처리한다.

만약 404.html과 같이 특정 상태를 지정하면 해당 파일을 보여주게 된다.

 

 

 

 

 

 

<404.html>


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
404 페이지 찾을수 없음!!
</body>
</html>

 


 

링크

 

 

 

 

 

 

해당 포스팅은 백기선 님의 인프런 강의를 보고 작성하였습니다.

 

 

반응형

댓글