SPRING/Spring MVC

[SpringMVC] SpringBoot에서 오류 페이지 띄우기

IT록흐 2023. 9. 1. 22:29
반응형

 

지난 포스팅에서 오류 페이지가 띄어지는 원리에 대해서 다루어 보았다.

 

 

 

 

 

HTTP 요청이 들어오면 WAS에서 컨트롤러까지 갔다가, 에러가 발생하면 컨트롤러에서 WAS까지 에러가 전파된 후, WAS는 에러코드에 대응되는 에러페이지 요청을 다시 컨트롤러로 보낸다. 그러면 컨트롤러는 요청에 대응하는 에러페이지를 경로를 뷰템플릿에 반환하여 렌더링하고 클라이언트에게 응답한다.

 

이 과정을 위해 2가지를 구현해야 했다. 

 

1) 에러페이지 객체 등록

@Component
public class WebServerCustomizer implements WebServerFactoryCustomizer<ConfigurableWebServerFactory> {
    @Override
    public void customize(ConfigurableWebServerFactory factory) {
        ErrorPage errorPage404 = new ErrorPage(HttpStatus.NOT_FOUND, "/error-page/404");
        ErrorPage errorPage500 = new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/error-page/500");
        ErrorPage errorPageEx = new ErrorPage(RuntimeException.class, "/error-page/500");

        factory.addErrorPages(errorPage404,errorPage500,errorPageEx);
    }
}

 

2) 에러페이지 호출 컨트롤러 구현

@Controller
public class ErrorPageController {
    // 404 에러
    @RequestMapping("/error-page/404")
    public String errorPage404(HttpServletRequest request, HttpServletResponse response) {
        return "error-page/404"; // 404 에러페이지 경로
    }
    
    // 500 에러
    @RequestMapping("/error-page/500")
    public String errorPage500(HttpServletRequest request, HttpServletResponse response) {
        return "error-page/500"; // 500 에러페이지 경로
    }
}

 

 

SpringBoot 환경에서는 두 가지 구현을 생략해도 된다. 

 

SpringBoot 이전에는 ErrorPageController를 직접 만들어야 했지만 SpringBoot는 동일한 기능을 가진 BasicErrorController 가지고 있다. 그러므로 약속된 위치에 약속된 이름으로 원하는 오류페이지만 위치시키면  SpringBoot가 알아서 에러코드와 대응하는 오류페이지를 클라리언트에게 응답한다.

 

- resources/templates/error/404.html

- resources/templates/error/4xx.html

- resources/templates/error/500.html

- resources/templates/error/5xx.html

 

오류페이지는 resources/templates/error 에 위치해야 한다. 그리고 오류페이지 파일명은 에러코드를 따서 만든다. 500에러는 500.html 오류페이지가 띄어진다. 4로 시작하는 모든 에러가 동일한 오류페이지를 띄우고 싶다면 4xx.html로 파일명을 지정한다. 이와 같은 방식으로 약속된 위치에, 약속된 이름으로 오류페이지 파일을 위치하면 별다른 구현없이도 커스터마이징된 오류페이지를 띄울 수 있다.

 

 

에러페이지에 에러 데이터 전달하기

 

서버에서 발생한 오류를 클라리언트에게 전달하는 것은 보안상 좋지 못하다. 그러므로 오류페이지에는 많은 정보를 동적으로 설정하기 보다는 정적으로 필요한 사실만 명시하면 된다. 

 

그렇다 하더라도 상황에 따라서는 오류 관련 정보를 페이지에 명시해야 될 때가 있다. 기존의 에러 관련 컨트롤러를 사용하면 이 과정을 직접 구현할 수 있다. HttpServletRequest에 다양한 에러 관련 정보가 저장되어 있기에, 여기서 에러 관련 데이터를 추출해서 Model에 담아 뷰템플릿에 전달하면 되었다.

 

그런데 만약, SpringBoot 환경에서 BasicErrorController를 사용하면 개발자가 코드를 건들 수 없다. SpringBoot는 이런 경우도 지원할 수 있도록, 에러 관련 데이터를 Model에 담아 뷰템플릿으로 전송하는 과정을 간단한 설정으로 구현할 수 있도록 해두었다. 

 

application.properties

server.error.include-exception=true // exception 포함여부
server.error.include-message=always // message 포함 여부
server.error.include-stacktrace=on_param // trace 포함 여부
server.error.include-binding-errors=on_param // errors 포함여부

 

Model에 오류 정보를 담을지 안 담을지에 대한 설정이다.

 

1) true/false 

server.error.include-exception=true  는 Model에 Exception 정보를 담는다는 의미이다.

true는 Model에 담는다. false는 모델에 안담는다.

 

2) never/always/on_param

 

기본값이 never이면 3가지 값이 들어갈 수 있다. 

 

never는 Model에 담지 않는다.

always는 Model에 담는다.

on_param은 쿼리스트링 파라미터로 요청이 들어올 때만 담는다는 의미이다. 

errors와 stacktrace는 on-param에서만 오류메시지를 출력한다는 설정이다.  그러므로 아래와 같은 url를 요청해보자. 

 

요청 URL : http://localhost:8080/error-ex?message=&errors=&trace=

 

 

 

요청의 결과 위와 같은 화면이 그려졌다. 사실 오류페이지에 이렇게 자세한 오류정보가 노출되어서는 안된다. 그러므로 개발과정에서 디버깅 목적으로만 사용하되, 실무에서는 사용해서는 안된다. 

 

 

SpringBoot 환경에서는 약속된 이름을 가진 오류페이지를 약속된 위치에 두면, SpringBoot가 알아서 에러 상황에 따라 적절한 오류페이지를 띄운다. 그리고 오류 정보를 오류페이지에 띄우고 싶다면 띄우고 싶은 오류정보를 설정파일에 설정하면 된다. 이처럼 SpringBoot는 간단하게 오류페이지를 띄울 수 있다. 

 

 

 


 

 

참고자료

 

스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 - 인프런 | 강의

웹 애플리케이션 개발에 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. MVC 2편에서는 MVC 1편의 핵심 원리와 구조 위에 실무 웹 개발에 필요한 모든 활용 기술들을 학습할 수 있

www.inflearn.com

 

 

 

 

반응형