본문 바로가기
BACK-END/SPRING

[Spring]예외처리(404에러, 500에러)

by 썬키 2022. 3. 15.

유효하지 않은 URL 입력 시 출력되는 404에러 페이지

보통은 쿼리문이 잘못 되었을 때 출력되는 500에러 페이지

 

에러 페이지에도 BootStrap를 적용시켜 꾸미는 방법을 배웠다.

 

 

우선, 500 에러 페이지부터 처리해보자.

 

1)예외처리를 위한 패키지 및 클래스 생성

 

com.webjjang.exception - CommonExceptionAdvice.java 

 

<CommonExceptionAdvice>

package com.webjjang.exception;

import org.springframework.http.HttpStatus;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.servlet.NoHandlerFoundException;

import lombok.extern.log4j.Log4j;

// 자동 생성과 역할
@ControllerAdvice
@Log4j
public class CommonExceptionAdvice {
	
	// Exception 예외가 발생되면 가져와서 처리해준다.
	@ExceptionHandler(Exception.class)
	public String except(Exception ex, Model model) {
		
		// console에 error message 출력
		log.error("////////// 예외처리 //////////");
		log.error("에러 메시지 : " + ex.getMessage());
		
		// JSP 페이지로 예외를 전달하기 위해 model에 담는다.
		model.addAttribute("exception", ex);
		
		// Model 출력
		log.error(model);
		
		// JSP로 이동시킨다.
		return "error/error_500";
	}
    }

이 코드에서 눈여겨볼 부분은 @ControllerAdvice, @ExceptionHandler 어노테이션이다.

위 두개의 어노테이션이 없으면 예외처리를 하지 않는다.

 

 

2)500 에러 페이지를 위한 error_500.jsp 생성

 

 

<error_500.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>500 Error Page</title>
</head>
<body>
	<div class="container">
		<h1 style="text-align: center">
			<strong>에러 페이지</strong>
		</h1>
		<hr>
		<br />
		<div class="alert alert-danger">${exception.message }</div>
		<ul class="list-group">
		<c:forEach items="${exception.stackTrace }" var="stack">
			<li class="list-group-item">${stack }</li>
		</c:forEach>
		</ul>
	</div>
</body>
</html>

에러 한 줄당, 박스를 만들기 위해 alert alert-danger를 이용하고

<c:forEach> 문을 이용해 에러 문구를 반복출력하게 만들었다.

 

 

 

예외처리가 잘 되었는지 실험해보기 위해

Mapper.xml에서 쿼리문에 오타를 낸 후 확인해보았다.

 

 

 

다음으로, 404 에러의 예외처리를 진행해본다.

 

 

 

1)web.xml 파일의 <init-param> 태그를 추가해준다.

 

2)CommonExceptionAdvice 클래스에서 코드를 추가해준다.

 

<CommonExceptionAdvice>

// 404번 오류
	@ExceptionHandler(NoHandlerFoundException.class)
	@ResponseStatus(HttpStatus.NOT_FOUND)
	public String handle404(NoHandlerFoundException ex) {
		
		log.error("////////// Not Found Page(404) //////////");
		log.error("유효하지 않은 페이지");
		
		return "error/error_404";
	}

 

3)404 에러 페이지를 위한 error_404.jsp 생성

 

<error_404.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>404 Not Found Page</title>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
	<div class="container">
		<h1 style="text-align: center">
			<strong>404 Not Found Page</strong>
		</h1>
		<hr>
		<br />
		<div class="alert alert-danger">페이지가 유효하지 않습니다.</div>
		<ul class="list-group">
			<li class="list-group-item">404 Error</li>
			<li class="list-group-item">주소를 확인 후, 다시 시도 해주세요.</li>
			<li class="list-group-item">오류가 계속 되면 담당자에게 연락 해주세요.</li>
			<li class="list-group-item">
				<div style="text-align:center;"><a href="/" class="btn btn-danger">메인으로 이동</a></div>
			</li>
		</ul>
	</div>
</body>
</html>

 

404 에러 페이지에는 decorator에 적용한 Bootstrap이 적용되지 않아

jsp 자체에 BootStrap 코드를 적용해주었다.

 

 

404 error

 

유효하지 않은 URL로 이동시, 위와 같이 404 에러가 뜨는 것을 확인할 수 있다.

 

 

 

예외처리는 그렇게 어렵지는 않은듯

댓글