게시물 상세보기(read.jsp) URL에서 없는 게시글 번호를 입력하면 게시글 번호가 없다는 에러가 발생합니다.
이럴 때 예외가 발생했을 때 처리를 해야합니다.
@ControllerAdvice를 이용한 예외처리를 해볼텐데요
스프링에서 제공하는 @Controller는 해당 메서드에서 발생한 예외를 모두 처리하는 역할을 수행해줍니다.
ExceptionAdvice.java를 생성하겠습니다.
package kr.co.web.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
@ControllerAdvice
public class ExceptionAdvice {
private static final Logger logger = LoggerFactory
.getLogger(ExceptionAdvice.class);
@ExceptionHandler(Exception.class)
public String common(Exception e) {
logger.info(e.toString());
return "error_common";
}
}
ExceptionAdvice 클래스의 선언된 어노테이션을 보시면 @ControllerAdvice로 선언이 되어 있는데요
이 @ControllerAdvice 어노테이션은 클래스의 객체가 컨트롤러에서 발생하는 예외를 처리하는 클래스라고 명시합니다.
common() 이라는 메서드를 이용해서 Exception 타입으로 처리되는 모든 예외를 처리하도록 설정합니다.
만약 예외가 발생하면 ExceptionAdvice의 common 메서드가 실행되어서 return 값으로 error_common 페이지로 이동합니다.
이동하고 오류 내용을 해당 페이지에 출력하고 싶다면, 오류 내용을 Model에 담아 error_common로 값을 전달하는데요
@ControllerAdvice 클래스의 메서드는 Exception 객체의 타입만을 파라미터로 사용할 수 있고, 일반 Controller와 같이 Model을 파라미터로 사용하지 못하도록 되어 있습니다.
그래서 하나의 객체에 Model 데이터와 View의 처리를 동시에 사용할 수 있는 ModelAndView 객체를 사용할텐
ModelAndView 객체는 하나의 객체에 Model 데이터와 View의 처리를 동시에 할 수 있는 객체 입니다.
이제 ModelAndView 객체를 이용하기 위해 코드를 수정하겠습니다.
package kr.co.web.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 ExceptionAdvice {
private static final Logger logger = LoggerFactory
.getLogger(ExceptionAdvice.class);
@ExceptionHandler(Exception.class)
public ModelAndView errorModelAndView(Exception e) {
logger.info(e.toString());
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("error_common");
modelAndView.addObject("exception", e);
return modelAndView;
}
}
이렇게 수정 한뒤 없는 번호를 입력해보겠습니다
http://localhost:8081/board/read?board_number=2666
아까는 500 error로 해당 데이터가 없다고 출력됐지만 예외를 처리하는 클래스인 ExceptionAdvice를 만들었기 때문에
error_common.jsp를 찾는건데요
error_common.jsp를 만들겠습니다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>오류 내용</h1>
<ul>
<!-- 예외발생 당시의 호출스택(Call Stack)에 있었던 메서드의 정보와 예외 메시지를 화면에 출력 -->
<c:forEach items="${exception.getStackTrace()}" var="stack">
<li>${stack.toString()}</li>
</c:forEach>
</ul>
</body>
</html>
정상적으로 에러 내용이 나옵니다!!