[Spring] 예외처리

Whatever·2022년 2월 11일
0

Spring(스프링)

목록 보기
18/29
  1. 예외처리란?
  • 프로그램이 처리되는 동안 문제가 발생 시 처리를 중단하고 다른 처리를 하는 것
  • 웹 컨테이너(tomcat)는 기본 오류 페이지를 표시해줌
  • 화면에 서버의 내부 정보가 일반인에게 노출되어 보안이 취약해지고 공격을 받을 수 있을므로 최대한 개발자가 직접 예외를 처리하여 정의한 오류 페이지를 표시하게 해줘야 함
  1. 예외 종류?
  • 시스템 예외
  • 의존 라이브러리에서 발생한 예외
  • 사용자 정의 예외
  • 스프링 프레임워크 예외
  1. 예외 발생 예시?
  • 등록 시 필수여야 하는데 빈 값을 입력하는 유효값 검증 예외
  • 수정 화면 생성 시 뷰 파일에서의 예외
  • 없는 글에 접근 시 예외
  • 없는 URL 요청 시 예외

예외처리하는 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)에서 예외
	@ExceptionHandler(Exception.class)
	public String handle(Exception e, Model model) {
		logger.info(e.toString());
		
		model.addAttribute("exception", e);
		//forwarding
		return "error/Exception";
	}
}

페이지 보내주는 Controller

ErrorController.java

package kr.or.ddit;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class ErrorController {
	@RequestMapping("/error/400")
	public String error400() {
		return "error/400";
	}
	@RequestMapping("/error/404")
	public String error404() {
		return "error/404";
	}
	@RequestMapping("/error/500")
	public String error500() {
		return "error/500";
	}
}

VIEW 단에서 보이는 예외발생 페이지

<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<!-- 404 Error Text -->
<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">&larr; 처음으로 이동</a>
</div>

0개의 댓글