[Spring] 18.SpringProject-예외처리
예외처리
아직 저희는 예외가 발생했을 때 예외처리를 하지 않았습니다!
예를 들어 다음과 같이 잘못된 매개변수를 전송한 경우 예외가 발생합니다
bno 가 300인 글이 없는데 조회를 해서 예외가 발생했습니다!
이처럼 예외가 발생했을 때 처리를 해주어야하는데요~!
저는 @ControllerAdvice를 이용한 예외처리를 하겠습니다!
스프링 MVC에서 제공하는 @ControllerAdvice는 호출되는 메소드에서 발생된 Exception을 모두 처리하는 역할을 합니다!
다음과 같이 모든 예외를 처리하는 CommonExceptionAdvice를 생성하겠습니다!
//CommonExceptionAdvice.java
package com.gguri.swp.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;
@ControllerAdvice
public class CommonExceptionAdvice {
private static final Logger logger = LoggerFactory
.getLogger(CommonExceptionAdvice.class);
@ExceptionHandler(Exception.class)
public String common(Exception e) {
logger.info(e.toString());
return "error_common";
}
}
클래스의 선언을 보면 @ControllerAdvice 애노테이션을 통해서 이 클래스의 객체가 컨트롤러에서 발생하는 Exception을 전문적으로 처리하는 클래스라는 것을 명시합니다!
common() 이라는 메소드를 이용해서 Exception 타입으로 처리되는 모든 예외를 처리하도록 설정되는 것을 볼 수 있습니다.
만약, 예외가 발생하면 CommonExceptionAdvice의 common 메소드가 실행되어 error_common.jsp로 이동하게 됩니다!
그런데, 오류 내용을 error_common.jsp에 출력하고 싶으면, 오류내용을 Model에 담아 error_common.jsp로 전달해야합니다.
하지만 @ControllerAdvice 클래스의 메소드는 Exception 객체의 타입만을 파라미터로 사용할 수 있고, 일반 Controller와 같이 Model을 파라미터로 사용하는 것은 지원하지 않습니다~
그래서 직접 ModelAndView 타입을 사용하는 형태로 작성해야합니다!
ModelAndView는 하나의 객체에 Model 데이터와 View의 처리를 동시에 할 수 있는 객체입니다!
그럼 ModelAndView를 사용하여 CommonExceptionAdvice 클래스를 수정하겠습니다!
//CommonExceptionAdvice.java
package com.gguri.swp.controller;
...
@ControllerAdvice
public class CommonExceptionAdvice {
private static final Logger logger = LoggerFactory
.getLogger(CommonExceptionAdvice.class);
@ExceptionHandler(Exception.class)
public ModelAndView errorModelAndView(Exception e) {
logger.info(e.toString());
//ModelAndView 객체 생성
ModelAndView modelAndView = new ModelAndView();
//View 이름 설정 (error_common.jsp)
modelAndView.setViewName("error_common");
//Exception 객체 modelAndView의 속성으로 추가
modelAndView.addObject("exception",e);
return modelAndView;
}
}
아까 http:// localhost:8080/board/read?bno=300을 다시 입력해보겠습니다!
error_common.jsp를 찾을 수 없다는 메시지가 나옵니다!
이제 error_common.jsp를 만들어보겠습니다!
<!-- error_common.jsp -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@include file="include/header.jsp" %>
<!-- 예외 메시지 출력 -->
<h4>${exception.getMessage()}</h4>
<ul>
<!-- 예외발생 당시의 호출스택(Call Stack)에 있었던 메서드의 정보와 예외 메시지를 화면에 출력 -->
<c:forEach items="${exception.getStackTrace()}" var="stack">
<li>${stack.toString()}</li>
</c:forEach>
</ul>
<%@include file="include/footer.jsp" %>
http:// localhost:8080/board/read?bno=300을 다시 입력해보겠습니다!
예외가 발생했을 때 error_common.jsp가 제대로 보여지는 것을 볼 수 있습니다.