⚙️ Backend/스프링(Spring) Framework

스프링(Spring) - 예외처리, 500 오류 (@ControllerAdvice)

코너(Corner) 2021. 5. 10.
반응형

예외처리, 500 오류 처리하기 알아보기 스프링(Spring) - 예외처리, 500, 404 오류 (@ControllerAdvice)

 

@ControllerAdvice // 해당 객체가 스프링의 컨트롤러에서 발생하는 예외를 처리하는 존재임을 명시.

 

package com.koreait.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 e, Model model) {
		// 예외가 발생하게 되면 해당 예외 필드가 메모리에 할당된다.
		// 할당된 예외 필드의 주소 값을 받을 객체가 필요하므로 매개변수에 Exception타입의
		// e 객체를 선언해놓는다.
		log.error("Exception........" + e.getMessage());
		model.addAttribute("exception", e);
		log.error(model);
		return "error_page";
	}
	
}

 

위와 같이 코드를 작성하고, 객체를 관리하는 root-context.xml에서 exception을 스캔해줘야 한다.

namespace에서 context 체크

<context:component-scan base-package="com.koreait.exception" /> 

추가

 

s 붙은것을 확인할 수 있다.

 

이제 error_page.jsp를 작성한다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>500</title>
</head>
<body>
	<h4><c:out value="${exception.getMessage()}"/></h4>
	
	<ul>
		<c:forEach var="stack" items="${exception.getStackTrace()}">
			<li><c:out value="${stack}"/></li>
		</c:forEach>
	</ul>
</body>
</html>

 

url 요청에 응답 오류를 고의로 작성하여 확인한다.

http://localhost:8080/sample/ex01?name=AAA&age=BBB

 

* 500 메시지는 Internal Server Error이므로 @ExceptionHandler를 이용해서 처리가 가능하지만

* 404 메시지는 잘못된 URL을 호출할 때 보이므로 다르게 처리해주어야 한다.


404error 페이지는 익셉션이 나지 않으므로, AOP로 보내기 위해서는 익셉션으로 만들어야 한다.

그것을 web.xml에서 처리한다.

		<init-param>
			<param-name>throwExceptionIfNoHandlerFound</param-name>
			<param-value>true</param-value>
		</init-param>

servlet 태그 안에 init-param 태그를 추가한다.

 

404는 요청을 받았으면 응답을 해주어야 쓰레드에 메모리에서 해제한다. 

@ResponseStatus를 하지 않으면 상태 오버플로우가 발생한다.

	@ExceptionHandler(NoHandlerFoundException.class)
	@ResponseStatus(HttpStatus.NOT_FOUND)
	public String handle404(NoHandlerFoundException ex) {
		return "error404_page";
	}

익셉션으로 만들었으면 서버에 응답을 해주어야 한다.

 

 

error404_page.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>404</title>
</head>
<body>
	<h2>해당 URL은 존재하지 않습니다.</h2>
	
</body>
</html>

 

http://localhost:8080/samd

URL에 없는 페이지를 요청하면 404 ERROR가 잘 뜨는것을 확인할 수 있다.

 

 

 

반응형

댓글