본문 바로가기
Spring 프레임워크/이론

Spring ExceptionResolver 을 사용한 예외 처리

by Hwanii_ 2023. 8. 18.
728x90

1.

[ 예외 처리 페이지 ]

 

예외가 발생 했을 경우, 404 Error 또는 500 Error 등의 에러가 발생 할 수 있는데,

이것을 클라이언트 (사용자) 에게 보여서는 안된다.

따라서, 예외가 발생 했을 경우, 사용자에게 보여줄 페이지를 만들어야 한다.

 

2.

핵심은 예외를 반드시 개발자가 직접 처리 해야 한다는 것이다.

 

로직을 통해서 예외를 잡는 경우

>>

자바에서, try-catch 블록 등을 사용해서 예외를 잡을 수 있고,

 

또는

 

null 등을 반환 하는 경우,

View 에서 JSTL 으로, null 이면 특정 문구가 나오도록 처리 할 수 있다.

 

보통은 위와 같이, 로직을 통해 개발자가 직접 예외를 처리 한다.

 

3.

그런데, Spring 에게 예외를 떠넘기는 방법이 존재 한다.

개발자 == 나

는 발생하는 예외 모르겠고 ~

Spring 아 너가 대신 예외 처리를 해줘 ~

인건데,

 

보통은 이렇게 예외 처리를 하지 않는다.

왜냐하면 예외를 직접 처리 하는게 중요하고,

예외를 던지고 결국 개발자가 처리를 하지 않으면,

발생하는 예외를 무시하는 격이 되어 버리기 때문 이다.

 

그래도, 이런 방법이 있다는 것을 알아 놓자.

 

4.

.xml 설정으로 예외 처리를 진행 한다.

 

@ 어노테이션 방식도 가능은 하지만,

@ 어노테이션 방식을 사용 하려면,

자바에서 작성 한다는 것이고,

자바에서 작성하려면, 해당하는 Xxx.java 클래스가 존재 해야 한다.

이때, Xxx.java 클래스를 HandlerMapping 이라던지, .. 는

Spring 에서 기본 제공을 해주는데,

예외 처리 시에 사용되는 객체에 대한 Xxx.java 클래스는,

Spring 에서 기본 제공 해주지 않는다.

그렇다는것은 개발자가 직접 해당하는 Xxx.java 클래스를 생성 해줘야 한다는 것인데,

번거롭고 귀찮기 때문에, 따라서, @ 어노테이션 방식으로 예외 처리를 하지 않는다.

 

5.

Spring 에서 예외 발생시,

자동으로 처리하고, 특정 페이지 까지, 사용자가 도달 할 수 있도록,

이 모든것을 전부 다 해주는 "객체" 가 존재 한다.

 

바로, ExceptionResolver 이다.

 

Resolver 류 이니까,

DispatcherServlet에 멤버이기 때문에, 둘은 의존 관계 이며,

따라서 의존 주입을 해줘야 한다.

 

DispatcherServlet 에 대해 의존 관계로 놓인 멤버에 대한 의존 주입 == 객체화 는

DispatcherServlet-servlet 에서 진행 한다.

 

그래서 해당 .xml 파일에서, <bean> 태그를 사용해서 객체화를 진행 한다.

 

아래에 작성된 코드를 확인 해보자.

 

 <bean id = "exceptionResolver" class = "org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
      		<property name = "exceptionMappings">
      			<props>
      				<prop key = "java.lang.ArithmeticException">error/error.jsp</prop>
            		<prop key = "java.lang.NullPointerException">error/error.jsp</prop>
      			</props>
   			</property>
   			
   			<!-- 등록 되지 않은 에러가 발생하는 경우, 예외를 처리 하기 위한 코드 이다. -->
   			<property name = "defaultErrorView" value = "error/error.jsp" />
</bean>

 

 

exceptionResolver 라는 변수로 식별자를 설정하고, 객체화 한다.

이때, class 속성 값으로,

handler.SimpleMappingExceptionResolver 라고 적혀 있는것을 확인 할 수 있다.

 

이는, HandlerMapping 과 유사한 느낌인데,

실제로 HM은 어떤 요청에 대해서,

어떤 XxxController 객체를 반환 하도록 하는 기능을 가진 객체기 때문에,

exceptionResolver 하고 유사 하다고 볼 수 있다.

왜 ?

exceptionResolver 은 어떤 예외에 대해서,

어떤 페이지로 가야할지를 결정 해주는 객체 이기 때문 이다.

 

이렇게, 키워드를 가지고, XxxController 객체를 반환 하기 때문에,

 

이 둘은, 팩토리 패턴 개념이라고 볼 수 있겠다.

 

<props> 태그 내부에,

<prop> 태그로 작성된 코드는, 발생할 특정한 예외에 대해서 작성 해놓고,

그러한 예외가 발생했을 경우에,

error 폴더에 있는 error.jsp 라는 페이지를 설정해 놓은 것을 확인 할 수 있다.

 

만약,

개발자가 발생할 예외에 대해,

따로 설정 하지 않은 경우에 대해서 발생하는 예외가 생길 수도 있을텐데,

이때,

property 태그를 사용해서, defaultErrorView 의 값으로 에러 페이지의 경로를 설정 할 수 있다.

 

6.

에러 페이지 만들기.

 

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isErrorPage="true" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>에러 페이지</title>
</head>
<body>

<h1>${exception}</h1>
<h3>${exception.message}</h3>

<hr>

<a href="main.do">메인으로 돌아가기</a>

</body>
</html>

 

에러 페이지를 설정 하려면, 페이지 상단에, isErrorPage 페이지 지시어의 값을 true 로 설정 해야 한다.

 

그리고, .xml 파일에서 모든 설정을 해줬으니, 해당 페이지 에서,

EL 표현식을 사용해서, 11 ~ 12 번 째 라인과 같이, 작성해 주면 된다.

 

7.

 

예외가 발생 했을 경우를 확인 하기.

 

 

 

 

반응형