Notice
Recent Posts
Recent Comments
Link
«   2026/04   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

우당탕탕 개발자 되기

Spring MVC-Controller(3) 본문

Spring

Spring MVC-Controller(3)

KimMINHun 2021. 2. 10. 01:36

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을 이용해서 전달하는 것이 좋다

org.zerock.exception 패키지는 servlet-context.xml에서 인식하지 않기 때문에 <component-scan>을 이용해서 해당 패키지의 내용을 조사>

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