우당탕탕 개발자 되기
Spring MVC-Controller(3) 본문
Controller의 Exception 처리
-@ExceptionHandler와 @ControllerAdvice를 이용한 처리
-@ResponseEntity를 이용하는 예외 메시지 구성
@ControllerAdvice
-AOP(핵심적인 로직은 아니지만 프로그램에서 필요한 '공통적인 관심사는 분리'하자는 개념)를 이용하는 방식
-AOP 방식을 이용하면 공통적인 예외사항에 대해서는 별도로 @ControllerAdvice를 이용해서 분리하는 방식
package org.zerock.exception;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import lombok.extern.log4j.Log4j;
@ControllerAdvice
@Log4j
public class CommonExceptionAdvice {
@ExceptionHandler(Exception.class)
public String except(Exception ex,Model model) {
log.info("Exception........."+ex.getMessage());
model.addAttribute("exception", ex);
log.error(model);
return "error_page";
}
}
@ControllerAdvice : 해당 객체가 스프링의 컨트롤러에서 발생하는 예외를 처리하는 존재임을 명시하는 용도로 사용
@ExceptionHandler : 해당 메서드가 () 들어가는 예외 타입을 처리한다는 것을 의미, 속성으로는 Exception 클래스 타입을 지정할수 있다. 위 코드와 같은 경우 Exception.class를 지정하였으므로 모든 예외에 대한 처리가 except()만을 이용해서 처리할수 있다.
만약 특정한 타입의 예외를 다루고 싶다면 Exception.class 대신에 구체적인 예외 클래스를 지정해야한다.
JSP 화면에서도 구체적인 메시지를 보고 싶다면 Model을 이용해서 전달하는 것이 좋다

CommonExceptionAdvice의 except()의 리턴값은 문자열 이므로 JSP 파일의 경로가 된다.
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" import="java.util.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<h4><c:out value="${exception.getMessage()}"></c:out></h4>
<ul>
<c:forEach items="${exception.getStackTrace() }" var="stack">
<li><c:out value="${stack }"></c:out></li>
</c:forEach>
</ul>
</body>
</html>
JSP는 error_page.jsp이므로 /WEB-INF/views 폴더내에 작성
404에러 페이지
-WAS 의 구동중 가장 흔한 HTTP 상태 코드는 404, 500 에러 코드이다.
500 메시지는 'Internal Server Error' 이므로 @ExceptionalHandler를 이용해서 처리가능
404 메시지 처럼 잘못된 URL을 호출 할때 보이는 경우는 조금 다르게 처리하는 것이 좋다
그러므로 404와 같이 WAS 내부에서 발생하는 에러를 처리하는 방식을 알아두는 것이 좋다.
<!-- Processes application requests -->
<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>
스프링 MVC의 모든 요청은 DispatcherServlet을 이용해서 처리되므로 404에러도 같이 처리할수 있게 web.xml을 수정한다.

<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://
www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<h1>해당 URL은 존재하지 않습니다.</h1>
</body>
</html>
에러 메시지 jsp로 작성해서 처리.
'Spring' 카테고리의 다른 글
| AOP (0) | 2021.03.23 |
|---|---|
| Spring MVC 프로젝트 구성 (0) | 2021.02.11 |
| Spring MVC-Controller(2) (0) | 2021.02.09 |
| Spring MVC -Controller (0) | 2021.02.09 |
| Spring MVC (0) | 2021.02.08 |