스프링 프레임워크/스프링 MVC

# Spring MVC 게시판 예제 03 - ExceptionResolver : 예외페이지 처리

edenDev 2023. 2. 21.

본 포스팅의 예제는 STS 또는 Eclipse를 사용하지 않고 Intellij를 통해 구현하고 있습니다.

그래서 기존의 STS(Spring Tool Studio)에서 생성된 Spring 프로젝트의 스프링 관련 설정 파일명과

프로젝트 구조가 약간 다를 수 있습니다.Intellij 스프링 mvc 프로젝트 생성 포스팅을 참고해주시면 감사하겠습니다.


Spring-MVC 기본 개념 및 테스트 예제 관련 포스팅 링크

순서 포스팅 제목
1 Intellij에서 Spring MVC Project 생성하기
2 Spring MVC - MariaDB 연결테스트
3 Spring MVC - Mybatis 설정 및 테스트
4 SpringMVC 구조
5 SpringMVC + Mybatis
6 Spring MVC Controller 작성 연습

 

Spring-MVC 게시판 예제 이전 포스팅 링크

순서 포스팅제목
1 IntelliJ를 이용한 Spring MVC Project 생성 하기
2 Bootstrap AdminLTE Template 적용하기

1. CustomExceptionResovler.java 만들기

AbstractHandlerExceptionResolver 를 상속하는 CustomExceptionResolver 클래스를 만들겠습니다.

해당 클래스에서 Exception에 대한 처리를 진행합니다.

public class CustomExceptionReSolver extends AbstractHandlerExceptionResolver {

    @Override
    protected ModelAndView doResolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {

        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("exception/exception_page");

        if (handler != null) {
            HandlerMethod handlerMethod = (HandlerMethod) handler;
            modelAndView.addObject("errorMethod", handlerMethod.getMethod().getName());
        }
        modelAndView.addObject("errorCause", ex.getCause());
        modelAndView.addObject("errorClass", ex.getClass().getSimpleName());
        modelAndView.addObject("errorMessage", ex.getMessage());

        return modelAndView;
    }
}​

Exception이 해당 Resolver로 넘어오면 ModelAndView 객체를 만들어서 Exception 관련 정보를 저장하여 리턴하도록 작성하였습니다. 예제 코드는 간단하게 에러 정보를 담아뷰를 리턴하는 것으로 끝냈지만 로그를 쌓는다던지 원하는 동작대로 코딩하시면 되겠습니다.


2. DispatcherServlet에 해당 ExceptionResolver 등록

방금 만든 ExceptionResolver가 Exception 발생시 매핑되도록 DispatcherServlet에 등록해주겠습니다.

class 명에 패키지까지 포함해서 방금 만든 ExceptionResolver Class를 입력해주면 됩니다.
* order: -1 로 넣은 것은 해당 ExceptionResolver의 우선 순위를 최상위로 하겠다는 것

    <!-- 예외 에러페이지 커스텀 마이징 -->
    <beans:bean class="com.spring.example.commons.exception.CustomExceptionReSolver">
        <beans:property name="order" value="1"/>
    </beans:bean>

3. jsp 파일 생성

Resolver에서 리턴할 뷰의 경로에 JSP 파일을 생성해 줍니다.

ExceptionResolver에서 넘기고 있는 에러에 관한 정보들을 화면에 뿌려주도록 하였습니다.

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<%@ include file="../include/head.jsp" %>
<html>
<body class="hold-transition skin-green-light sidebar-mini" oncopy="return false" oncut="return false"
      onpaste="return false">
<div class="wrapper">

    <%@ include file="../include/top_menu.jsp" %>

    <%@ include file="../include/left_menu.jsp" %>

    <div class="content-wrapper">
        <section class="content-header">
            <h1>
                예외 발생
                <small>스프링연습예제</small>
            </h1>
            <ol class="breadcrumb">
                <li><a href="#"><i class="fa fa-dashboard"></i> board</a></li>
                <li class="active">exception</li>
            </ol>
        </section>

        <%-- Main content --%>
        <section class="content container-fluid">

            <div class="col-lg-12">
                <p>Exception : ${errorClass}</p>
                <p>Method : ${errorMethod}</p>
                <p>Message : ${errorMessage}</p>
                <p>Cause: ${errorCause}</p>
            </div>

        </section>
    </div>

    <%@ include file="../include/footer.jsp" %>

</div>

<%@ include file="../include/plugin_js.jsp" %>
</body>
</html>

 


3. 테스트

테스트를 위해 컨트롤러에 아래 코드를 추가해서 예외(Exception)을 발생시키겠습니다.

    @GetMapping("/makeException")
    public void makeException() throws Exception {
        throw new NullPointerException();
    }

해당 주소로 이동하여 에러를 발생시키면 exception_page.jsp 로 연결되고

Model에서 넘겼던 Exception 정보들이 출력되는 것을 확인할 수 있습니다.


4. 마무리

그냥 사용방법을 설명하기 위해서 간단하게 예제를 만들어 보았습니다.

에러 종류에 따라 다른 뷰로 연결하여도 되고, 원하는 다른 작업을 얼마든지 할 수 있습니다.

광장히 쉽고 간단하게 Exception에 대한 관리를 할 수 있습니다.


 

댓글