[Spring] 18.SpringProject-예외처리




예외처리



아직 저희는 예외가 발생했을 때 예외처리를 하지 않았습니다!

예를 들어 다음과 같이 잘못된 매개변수를 전송한 경우 예외가 발생합니다


image



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을 다시 입력해보겠습니다!


image




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을 다시 입력해보겠습니다!


image



예외가 발생했을 때 error_common.jsp가 제대로 보여지는 것을 볼 수 있습니다.