1. 개요

모든 웹 애플리케이션의 공통 요구 사항은 사용자 정의된 오류 페이지입니다.

예를 들어 Tomcat 위에서 바닐라 Spring MVC 앱을 실행하고 있다고 가정합니다. 사용자가 브라우저에 잘못된 URL을 입력하면 사용자에게 그다지 친숙하지 않은 파란색 및 흰색 스택 추적이 표시됩니다. 이는 이상적이지 않습니다.

이 사용방법(예제)에서는 몇 가지 HTTP 오류 코드에 대해 사용자 지정 오류 페이지를 설정합니다.

작업 가정은 독자가 Spring MVC로 작업하는 데 상당히 익숙하다는 것입니다. 그렇지 않은 경우 시작하는 좋은 방법 입니다.

이 기사는 Spring MVC에 초점을 맞춥니다. Whitelabel 오류 페이지 사용자 정의 기사에서는   Spring Boot에서 사용자 정의 오류 페이지를 생성하는 방법을 설명합니다.

2. 간단한 단계

여기에서 수행할 간단한 단계부터 시작하겠습니다.

  1. 오류가 생성될 때마다 오류를 처리하는 메서드에 매핑 되는 단일 URL /errorsweb.xml에 지정합니다.
  2. /errors 매핑을 사용하여 ErrorController 라는 컨트롤러를 만듭니다.
  3. 런타임 시 HTTP 오류 코드를 파악하고 HTTP 오류 코드에 따라 메시지를 표시합니다 . 예를 들어, 404 오류가 생성되면 'Resource not found' 와 같은 메시지가 표시되어야 하는 반면, 500 오류의 경우 사용자는 'Sorry! 내부 서버 오류가 발생했습니다.'

3. web.xml

web.xml에 다음 줄을 추가하는 것으로 시작합니다 .

<error-page>
    <location>/errors</location>
</error-page>

이 기능은 3.0 이상의 Servlet 버전에서만 사용할 수 있습니다.

앱 내에서 생성된 모든 오류는 HTTP 오류 코드와 연결됩니다. 예를 들어, 사용자가 브라우저에 URL /invalidUrl입력 했지만 그러한 RequestMapping 이 Spring 내부에 정의 되지 않았다고 가정합니다 . 그런 다음 기본 웹 서버에서 생성된 404의 HTTP 코드입니다. web.xml에 방금 추가한 줄 은 URL /errors에 매핑된 메서드에 작성된 논리를 실행하도록 Spring에 지시 합니다.

여기서 잠깐 덧붙이자면 해당 Java Servlet 구성에는 불행히도 오류 페이지를 설정하기 위한 API가 없습니다. 따라서 이 경우 실제로 web.xml 이 필요합니다 .

4. 컨트롤러

계속해서 이제 ErrorController 를 만듭니다 . 오류를 가로채고 오류 페이지를 표시하는 단일 통합 메서드를 만듭니다.

@Controller
public class ErrorController {

    @RequestMapping(value = "errors", method = RequestMethod.GET)
    public ModelAndView renderErrorPage(HttpServletRequest httpRequest) {
        
        ModelAndView errorPage = new ModelAndView("errorPage");
        String errorMsg = "";
        int httpErrorCode = getErrorCode(httpRequest);

        switch (httpErrorCode) {
            case 400: {
                errorMsg = "Http Error Code: 400. Bad Request";
                break;
            }
            case 401: {
                errorMsg = "Http Error Code: 401. Unauthorized";
                break;
            }
            case 404: {
                errorMsg = "Http Error Code: 404. Resource not found";
                break;
            }
            case 500: {
                errorMsg = "Http Error Code: 500. Internal Server Error";
                break;
            }
        }
        errorPage.addObject("errorMsg", errorMsg);
        return errorPage;
    }
    
    private int getErrorCode(HttpServletRequest httpRequest) {
        return (Integer) httpRequest
          .getAttribute("javax.servlet.error.status_code");
    }
}

5. 프런트 엔드

데모를 위해 오류 페이지를 매우 간단하고 간결하게 유지하겠습니다. 이 페이지에는 흰색 화면에 표시되는 메시지만 포함됩니다. errorPage.jsp 라는 jsp 파일을 만듭니다 .

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ page session="false"%>
<html>
<head>
    <title>Home</title>
</head>
<body>
    <h1>${errorMsg}</h1>
</body>
</html>

6. 테스트

모든 애플리케이션에서 발생하는 가장 일반적인 두 가지 오류인 HTTP 404 오류와 HTTP 500 오류를 시뮬레이션합니다.

서버를 실행하고 localhost:8080/spring-mvc-xml/invalidUrl로 이동합니다. 이 URL이 존재하지 않기 때문에 ' Http 오류 코드: 404. 리소스를 찾을 수 없음' 메시지와 함께 오류 페이지가 표시될 것으로 예상됩니다 .

핸들러 메소드 중 하나가 NullPointerException을 던질 때 어떤 일이 일어나는지 봅시다 . ErrorController에 다음 메서드를 추가합니다 .

@RequestMapping(value = "500Error", method = RequestMethod.GET)
public void throwRuntimeException() {
    throw new NullPointerException("Throwing a null pointer exception");
}

에 가서 로컬 호스트 : 8080 / 스프링 MVC-XML / 500Error. 'Http 오류 코드: 500. 내부 서버 오류' 메시지와 함께 흰색 화면이 표시되어야 합니다.

7. 결론

Spring MVC를 사용하여 다른 HTTP 코드에 대한 오류 페이지를 설정하는 방법을 보았습니다 . HTTP 오류 코드에 따라 오류 메시지가 동적으로 표시되는 단일 오류 페이지를 만들었습니다.

Generic footer banner