본문 바로가기
Spring

@ControllerAdvice를 사용한 Exception 처리

by skwzz 2019. 12. 13.

Spring MVC 에서 예외 처리하는 방식

1. @ControllerAdvice + @ExceptionHandler 이용한 처리

2. @ResponseEntity를 이용하는 예외 메세지 구성 

(지금 1만 보고 나중에 2 추가)

 

@ControllerAdvice

해당 객체가 스프링의 컨트롤러에서 발생하는 예외를 처리하는 클래스임을 명시

 

@ExceptionHandler

해당 메서드가 () 들어가는 예외 타입을 처리한다는 것을 의미

 

1. 패키지 생성, Exception 처리 담당 클래스 생성 (CommonExceptionAdvice.java)

@ControllerAdvice
@Log4j
public class CommonExceptionAdvice {
	@ExceptionHandler(Exception.class)
	public String exception(Exception ex, Model model) {
		log.error("|||Exception||| : "+ex.getMessage());
		model.addAttribute("exception", ex);
		log.error(model);
		return "error_page";
	}
}

 

 

2. servlet-context에 component-scan 할 패키지로 등록

<context:component-scan base-package="org.skwzz.exception" />

 

 

3. 에러 페이지 작성 ( error_page.jsp )

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" import="java.util.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h4><c:out value="${exception.getMessage() }"></c:out></h4>
	<hr>
	<ul>
		<c:forEach items="${exception.getStackTrace() }" var="stack">
			<li><c:out value="${stack }"></c:out></li>
		</c:forEach>
	</ul>
</body>
</html>

 

 

4. 테스트 (get방식의 파라미터에 이상한 값 넣었음)

 

 

모든 예외 처리를 담당하는 메소드를 작성했는데

이번엔 404 페이지만 담당할 메소드를 만들겠음

Spring의 요청은 DispatcherServlet을 이용해 처리되므로 404 에러도 같이 처리할 수 있도록 web.xml 수정

 

 

5. web.xml에 해당 내용 추가

<servlet>
	<servlet-name>appServlet</servlet-name>
	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	<init-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
	</init-param>
	<init-param>
		<param-name>throwExceptionIfNoHandlerFound</param-name>
		<param-value>true</param-value>
	</init-param>
	<load-on-startup>1</load-on-startup>
</servlet>

 

 

6. 만들었던 예외처리 클래스에 해당 메소드 추가

@ExceptionHandler(NoHandlerFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
public String handle404(NoHandlerFoundException ex) {
	return "custom404";
}

 

 

7. custom404.jsp 페이지 작성

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>해당 페이지는 존재하지 않습니다.</h1>
</body>
</html>

 

 

8. 서버에 존재하지 않는 url로 요청 테스트

 

'Spring' 카테고리의 다른 글

Spring - MyBatis 연동  (0) 2019.12.13
Spring - Oracle 연결 테스트, CP 설정  (0) 2019.12.13