Spring

[Spring] 예외처리 (@, xml 활용 방식)

코딩 수달 2022. 9. 28. 16:50
반응형

예외처리 

예외가 발생하였을 때 예외페이지로 이동할 수 있도록 설정하는 방법은 @, xml 두 가지 방법으로 처리 가능하다. 

 

이전에 에러 처리와 에러 페이지 설정의 차이에 대해서 하기와 같이 정리해 보았다. 

에러처리 

-> 에러 자체가 발생되지 않도록 선처리(유효성 검사) 

-> 에러가 발생하더라도 넘어갈 수 있도록 (try-catch) 처리 

에러 페이지 설정 

-> 에러는 발생할 수 있다. 

에러 발생시 왜 발생했는지 -1 

어디로 가야하는지 안내 -2 해주는 페이지 

ex ) 네이버 웹툰에서 url에 유료 페이지에 대한 정보를 입력하면 그냥 목록으로 안내 

 


@ 설정 

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

 

1. 전처리 과정 (xml 설정) 

@을 사용할거라고 설정파일(.xml)에게 알려줘야 하므로 

DispatcherServlet-servlet.xml 파일 Namespaces에 mvc를 선택한다. 

Namespaces 추가 후 com.kim.biz.common 패키지에 에러페이지를 매핑하는 클래스를 만들 예정이기 때문에 

경로는 <context:component-scan base-package="com.kim.biz" />

예외 설정에 @ 스캔해달라는 의미인 <mvc:annotation-driven/> 작성해준다. 

<?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:aop="http://www.springframework.org/schema/aop"
	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
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd">

	<!-- common에다가 @설정 넣을 것이므로 하기 경로로! -->
	<context:component-scan base-package="com.kim.biz" />
	
	<!-- 예외 페이지 설정 지금부터 @관련 설정 달아놓을건데 너가 그거 스캔해줘~~ --> 
	<mvc:annotation-driven/>
	
</beans>

2. 예외 처리 클래스 생성 

 

어떤 예외를 어떻게 처리할지 예외 처리 클래스를 새로 생성해서 그 안에 내용을 입력해 준다. 

예외페이지의 경로와 예외 내용도 반환해주기 위해서 output으로 ModelAndView를 사용한다. 

 

@ControllerAdvice

  • 클래스 수행을 위해서 클래스를 객체화 해주는 @
  • 범위값을 지정해주면서 해당 패키지의 컨트롤러에서 발생되는 예외를 처리해준다.  

@ExceptionHandler 

  • 메서드에 붙일 수 있으며 @RequestMapping과 비슷한 역할로 bean내에서 발생하는 예외를 잡아서 하나의 메서드로 처리 해주는 기능을 가지고 있다. 
  • 인자로 캐치하고 싶은 예외 클래스를 등록한다. 
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 {

	/*@RequestMapping과 비슷한 역할로 bean내에서 발생하는 예외를 잡아서 하나의 메서드로 처리해주는 기능*/
   @ExceptionHandler(NullPointerException.class)//인자로 캐치하고 싶은 예외클래스를 등록
   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;
   }
}

3. 에러페이지 

 

에러페이지 경로 : webapp/error/error.jsp 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isErrorPage="true" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<h1>${exception.message}</h1>
<a href="login.do">go to login</a>

</body>
</html>

XML 설정

특징 : 간편(별도로 예외처리클래스를 만들지않아도 괜찮다.) 

 

1.  xml 설정

위에서 보았던 @으로 설정하는 방식과 개념을 동일하지만, 예외 처리 클래스를 별도로 생성할 필요도 없고 

XML 설정만 처리해주면 되기때문에 더 간편한 방식이다. 

 

※ 클래스 이름 중에 ~~Resolver로 끝나는 클래스는 id명이 고정되있으므로 절대 변경하면 안된다!! 

<?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:aop="http://www.springframework.org/schema/aop"
	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
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd">

	<!-- common에다가 @설정 넣을 것이므로 하기 경로로! -->
	<context:component-scan base-package="com.kim.biz" />
	 
     <!-- spring 예외 관련 클래스 --> 
	  <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>

</beans>

2. 에러페이지 

 

@설정 때 사용했던 페이지와 동일하다.

반응형