- 예외처리란?
- 프로그램을 처리되는 동안 문제가 발생 시 처리를 중단하고 다른 처리를 하는 것
- 웹 컨테이너(tomcat)는 기본 오류 페이지를 표시해줌
- 화면에 서버의 내부 정보가 일반인에게 노출되어 보안이 취약해지고 공격을 받을 수 있으므로, 최대한 개발자가 직접 예외를 처리하여 정의한 오류 페이지를 표시하게 해줘야 한다.
- 예외 종류?
- 시스템 예외
- 의존 라이브러리에서 발생한 예외
- 사용자 정의 예외
- 스프링 프레임워크 예외
- 예외 발생 예시?
- 등록 시 필수여야 하는데 빈 값을 입력하는 유효값 검증 예외
- 수정화면 생성 시 뷰 파일에서의 예외
- 삭제 시 매핑 파일에서의 예외
- 없는 글에 접근 시 예외
- 없는 URL 요청 시 예외
예시
1. 예외처리 Handler Controller
CommonExceptionHandler.java
package kr.or.ddit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
//스프링 컨트롤러에서 발생된 예외를 처리하는 핸들러 클래스 임을 명시함
@ControllerAdvice
public class CommonExceptionHandler {
private static final Logger logger = LoggerFactory.getLogger(CommonExceptionHandler.class);
//괄호 안에 설정한 예외타입을 해당 메서드가 처리한다는 것을 의미함
// <exception-type>java.lang.Exception</exception-type>
//없는 URL 요청 예외(X)
//수정화면 생성 시 뷰 파일(jsp)에서 예외(X)
@ExceptionHandler(Exception.class)
public String handle(Exception e, Model model) {
logger.info(e.toString());
model.addAttribute("exception", e);
//forwarding
return "error/Exception";
}
}
2. 에러페이지로 보내주는 Controller
ErrorController.java
package kr.or.ddit;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class ErrorController {
@RequestMapping(value = "/error/400")
public String error400() {
return "error/400";
}
@RequestMapping(value = "/error/404")
public String error404() {
return "error/404";
}
@RequestMapping(value = "/error/500")
public String error500() {
return "error/500";
}
}
3. JSP
Exception.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<div class="text-center">
<div class="error mx-auto" data-text="Exception">Exception</div>
<p class="lead text-gray-800 mb-5">
${exception.getMessage()}
</p>
<ul>
<c:forEach var="stack" items="${exception.getStackTrace()}">
<li>${stack.toString()}</li>
</c:forEach>
</ul>
<a href="/lprod/list">←처음으로 이동</a>
</div>
400.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<div class="text-center">
<div class="error mx-auto" data-text="400">400</div>
<p class="lead text-gray-800 mb-5">Bad Request</p>
<a href="/lprod/list">←처음으로 이동</a>
</div>
404.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<div class="text-center">
<div class="error mx-auto" data-text="404">404</div>
<p class="lead text-gray-800 mb-5">Page Not Found</p>
<a href="/lprod/list">←처음으로 이동</a>
</div>
500.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<div class="text-center">
<div class="error mx-auto" data-text="500">500</div>
<p class="lead text-gray-800 mb-5">Internal Server Error</p>
<a href="/lprod/list">←처음으로 이동</a>
</div>