예외처리
예외가 발생하였을 때 예외페이지로 이동할 수 있도록 설정하는 방법은 @, 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. 에러페이지
@설정 때 사용했던 페이지와 동일하다.
'Spring' 카테고리의 다른 글
[Spring] Mybatis 프레임워크 설치, DB연동 (0) | 2022.10.04 |
---|---|
[Spring] 다국어 처리 (0) | 2022.09.30 |
[Spring] 이미지 파일 업로드 & 변경 (0) | 2022.09.28 |
[Spring] 2-Layered Architecture (Presentation Layer, Business Layer) (0) | 2022.09.27 |
[Spring] 어노테이션@ - RequestParam, ModelAttribute, SessionAttributes (0) | 2022.09.23 |