예외 사항을 전부 핸들링 해야 한다면 중복적이고 많은 양의
코드를 작성해야 하지만, 공통적인 예외사항에 대해서는 별도로
@ControllerAdvice를 이용해서 분리한다. AOP를 이용하는 방식이다.
발생하는 예외의 타입별로 흐름을 나눠줄 때 사용하는 매핑방식
예외를 발생시키기 위한 메소드를 하나 추가한다.
@GetMapping("ex05")
public void ex05(){
String str = null;
str.charAt(10);
}
//해당 객체가 스프링의 컨트롤러에서 발생하는 예외를 처리하는 존재임을 명시
@ControllerAdvice
@Log4j
public class CommonExceptionAdvice {
@ExceptionHandler(Exception.class)
public String exception(Exception e, Model model) {
log.error("======Excepiton======");
log.error(e.getMessage());
model.addAttribute("exception",e);
return "error_page";
}
}
예외 발생시 이동할 error_page.jsp 파일도 만들어준다.
에러 페이지를 만들기위해 el문에서 exception 뒤에 .stackTrace를 추가해준다.
*stack trace는 프로그램에서 익셉션이 발생한 위치를 정확하게 알려줍니다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>오류 페이지</title>
</head>
<body>
<h2 style="background-color: black; color:yellow;">치명적인 오류 발생</h2>
<ul style="color:red;">
<c:forEach var="stack" items="${exception.stackTrace}">
<li>${stack}</li>
</c:forEach>
</ul>
</body>
</html>
이제 서버를 키고 브라우저를 켜서 localhost:9090/ex01/sample/ex05 주소로 이동하게되면
이런식으로 오류페이지로 이동하는 것을 볼 수가 있다.