본문 바로가기

개발자노트/Spring

Spring - 에러 페이지 설정 , 예외처리

❗ 자주 햇갈리는 것 !!

✅  에러처리 : 에러 자체가 발생되지 않게 선처리 (유효성 검사)
                  에러가 발생하더라도, 넘어갈 수 있게(try-catch) 처리

 

✅  에러 페이지 설정 : 에러는 발생할 수 있다.
                           에러발생 시, 왜 발생했는지 -1
                           어디로 가야하는지 안내 -2 해주는 페이지
                           ex) 웹툰에서 유료화의 링크로 가려하면 메인으로 돌려주는 방식

 

 

 

 

설정방법

 

공통 : 에러페이지 만들기

${exception.message } 으로 에러상태 확인 가능

 

 

 

1) @ 어노테이션으로 설정

 

@을 앞으로 사용할 예정이라고 설정파일(.xml)에게 알려줘야함 

 

  DispatcherServlet-servlet.xml 에 네임스페이스 mvc추가

 


바디에 <mvc:annotation-driven /> 추가



복잡함(@으로 사용하려면 예외처리 클래스를 1개 이상 만들어줘야함)

 

 


@ControllerAdvice

어느 범위에서 예외가 일어날지 설정한다.

 

 


@ExceptionHandler

어떠한 예외가 발생했을 때 어떠한 행동을 취할지 매핑해준다. ( 에러페이지로 이동을 시킴 )

 

 

 

 

 

 

2) XML으로 설정

 

간편함(별도로 예외처리 클래스를 만들지 않아도 괜찮음)

 

DispatcherServlet-servlet.xml에 하단과 같이 exceptionResolver을 등록해주고,

property 의존성 주입을 해주면 된다.

key에 어떠한 오류가 발생했을 때 body에 오류페이지의 경로를 작성해주면 된다.

 

 

 

 

 

 

소스코드

 

DispatcherServlet-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd">

	<context:component-scan base-package="com.kim.biz" />
	
	<!-- 예외 페이지 설정 (어노테이션 방식 )
	<mvc:annotation-driven /> -->
	
	<!--  예외 처리 페이지 설정 (XML 방식) -->
	   <bean id="exceptionResolver" 
	  class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
      <property name="exceptionMappings">
         <props>
            <prop key="java.lang.NullPointerException">error/error.jsp</prop>
            <prop key="java.lang.ArithmeticException">error/error.jsp</prop>
            <prop key="java.lang.Exception">error/error.jsp</prop>
         </props>
      </property>
   </bean>
	
	   <!-- 파일 업로드 관련 설정 -->
   <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
      <property name="maxUploadSize" value="100000" />
   </bean>
		
<!-- 
	HM 등록
	<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
		<property name="mappings">
			<props>
				<prop key="/login.do">login</prop>
				<prop key="/main.do">main</prop>
				<prop key="/board.do">board</prop>
				<prop key="/logout.do">logout</prop>
			</props>
		</property>
	</bean>

	
	<bean id="login" class="com.kim.biz.controller.LoginController" />
	<bean id="main" class="com.kim.biz.controller.MainController" />
	<bean id="board" class="com.kim.biz.controller.BoardController" />
	<bean id="logout" class="com.kim.biz.controller.LogoutController" />
	
	
	<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/view/" />
		<property name="suffix" value=".jsp" />
	</bean>
 -->

</beans>

 

 

CommonExceptionHandler.java

package com.kim.biz.common;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;

@ControllerAdvice("com.kim.biz") // CommonExceptionHandler를 개체화해주는 @
								 // 횡단관심처럼 만들어주는 @
								 // 예외잡는 범위
public class CommonExceptionHandler {

	
		@ExceptionHandler(NullPointerException.class) // nullpointer
		public ModelAndView aException(Exception e) { 
			ModelAndView mav=new ModelAndView();
			mav.addObject("exception",e);
			mav.setViewName("/error/error.jsp");
			return mav;
		}
		@ExceptionHandler(ArithmeticException.class) // 수학적인 문제
		public ModelAndView bException(Exception e) {
			ModelAndView mav=new ModelAndView();
			mav.addObject("exception",e);
			mav.setViewName("/error/error.jsp");
			return mav;
		}
		@ExceptionHandler(Exception.class)
		public ModelAndView cException(Exception e) { // 그 외 모든 예외
			ModelAndView mav=new ModelAndView();
			mav.addObject("exception",e);
			mav.setViewName("/error/error.jsp");
			return mav;
		}
}