본문 바로가기

java

[210623] spring boot - error page 만들기

.

 

고객에게 서비스를 하는 웹 서비스는 에러가 발생했을 때 에러 문구를 그대로 출력해서는 안 된다. 보안 상으로 문제가 생길 수 있기 때문이다. 그래서 지금 진행하는 프로젝트에서도 whitelabel error page를 그대로 출력하는 대신, 커스텀 된 에러 페이지를 출력해야겠다고 생각했다. 

jsp에서는 web.xml에 error page를 등록하고, page 디렉터브의 errorPage 속성을 사용해서 에러 페이지를 설정할 수 있었다. Spring에서는 방법이 다르다. 

 

1. proerties에 아래 속성을 추가한다. 

server.error.whitelabel.enabled=false 

 

2. error.html을 생성하고, 에러가 발생했을 때 출력할 페이지를 작성한다. 

<!DOCTYPE html>
<html>
    <title>Error page</title>
<body>
    <h1>에러가 발생했습니다! </h1>
    <a href="/">홈으로 돌아가기</a>
</body>
</html>

프로그램을 실행해보면, whitelabel error page 대신 커스텀한 에러 페이지가 출력되는 것을 확인할 수 있다. 

 

이는 스프링이 기본적으로 /error에 대한 매핑을 지원하기 때문이다. 이외에도 Spring은 에러가 발생했을 때 에러의 세부사항이나 HTTP 상태, 에러 메시지를 JSON 형태로 제공해준다. server.error 속성을 사용하거나, ErrorController를 만들고 해당 유형의 빈 정의를 등록하거나, ErrorAttribute 유형의 빈을 추가하는 형태로 에러 페이지를 커스텀마이징할 수 있다. 

 

4xx 에러가 발생했을 때와 5xx 에러가 발생했을 때의 에러 페이지를 다르게 만들어보았다. 

 

 

@Controller
public class ErrorController implements ErrorViewResolver {
    @Override
    public ModelAndView resolveErrorView(HttpServletRequest request, HttpStatus status, Map<String, Object> model) {
        if (status.is4xxClientError()) {
            return new ModelAndView("4xx");
        }else if(status.is5xxServerError()){
            return new ModelAndView("5xx");
        }

        return new ModelAndView("error");
    }
}

에러 처리를 맡을 ErrorController를 생성했다. 

ErrorViewResolver를 implements받고 override받은 resolverErrorView 메소드를 재정의했다. status의 값이 4xx에러면 4xx 뷰를 출력하고, 아니면 5xx 뷰를, 둘 다 아니면 기본 error page를 출력하도록 만들었다. 

 

5xx 에러가 발생했을 때의 실행 결과다. 

 

 

 

 

- Reference

https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#features.developing-web-applications.spring-mvc.error-handling.error-pages

https://www.baeldung.com/spring-boot-custom-error-page