스프링에서 예외처리하는 방법은 크게 3가지가 있다.
1. try/catch를 이용한 간단한 예외처리
2. 각각의 컨트롤러단에서 @ExceptionHandler를 이용한 예외처리
3. @ControllerAdvice를 이용한 전역 예외처리
try/catch의 경우 스프링이아닌 자바의 예외처리이기 때문에
yous3163.tistory.com/11?category=990150
9주차 : 예외, 에러
자바에서 예외 처리 방법 (try, catch, throw, throws, finally) 자바가 제공하는 예외 계층 구조 Exception과 Error의 차이는? RuntimeException과 RE가 아닌 것의 차이는? 커스텀한 예외 만드는 방법 예외란 사..
yous3163.tistory.com
다음 글에서 자세히 살펴볼 수 있고,
2번째인 @ExceptionHandler의 경우 컨트롤러 단에서 코드가 많이 중복되기 때문에 전역으로 처리가 가능한 @ControllerAdvice 처리방법에 대해 알아보도록 하자.
먼저 ExceptionHandler.java 파일을 생성해준다.
글쓴이는 게시판을 만들고 있기 때문에 이 프로젝트에서 예외처리를 적용해볼 생각이다.
sungpillhong/board
Contribute to sungpillhong/board development by creating an account on GitHub.
github.com
git에 현재 적용중이므로 따라서 해보면 좋을 것 같다.
자바 11버전, Gradle환경이다.
package com.insight.board.common;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
/*
@ControllerAdvice 해당 클래스가 예외처리 클래스임을 알려줌.
*/
@Slf4j
@ControllerAdvice
public class ExceptionHandler {
@org.springframework.web.bind.annotation.ExceptionHandler(Exception.class)
public ModelAndView defaultExceptionHandler(HttpServletRequest request, Exception exception){
ModelAndView mv = new ModelAndView("/error/error_default");
mv.addObject("exception", exception);
log.error("Exception", exception);
return mv;
}
}
@org.springframework.web.bind.annotation.ExceptionHandler(Exception.class)
해당 메서드에서 처리할 예외를 지정한다.
여기서는 기능을 확인하기 위해 간단히 Exception.class로 설정해서 모든 예외를 처리하였다.
하지만 실제 프로젝트에서는 다양한 예외를 처리하기 위해 각각 예외처리가 필요하다
즉, NullPointerException, NumberFormatException 등 자바의 기본 예외 및 프로젝트에 필요한 커스텀 예외를 포함해서 각각의 예외에 맞는 적절한 예외처리가 필요하다.
또한 자바의 모든 예외는 Excpetion 클래스를 상속받고 있기 때문에 코드상에서 Exception.class를 처리하는 메서드 보다 위쪽에 있어야 예외를 정상적으로 처리할 수 있다.
즉, Excpetion.class를 처리하는 메서드를 가장 마지막에 두어야 한다.
ModelAndView mv = new ModelAndView("/error/error_default");
이 부분은 예외 발생 시 보여줄 화면을 지정한다. 애플리케이션이 실행되는 중 에러가 발생하면 그 에러에 따라 적절한 예외처리 화면을 사용자에게 보여주는 것이 좋다.
간단하게 templates 안에 error_default.html을 생성해보자.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>공통 에러 페이지</title>
<link rel="stylesheet" th:href="@{/css/style.css}"/>
</head>
<body>
<p>공통 에러 페이지</p>
<p th:text="${exception}"></p>
<ul th:each="list:${exception.getStackTrace()}"
th:text="${list.toString()}"></ul>
</body>
</html>
그리고 Controller에서 일부러 에러를 내보도록 하겠다.
@RequestMapping("/board/openBoardList.do")
public ModelAndView openBoardList() throws Exception{
//templates 폴더 아래에 있는 board/boardList.html을 의미한다.
ModelAndView mv = new ModelAndView("board/boardList");
int i = 10 / 0 ;
List<BoardDto> list = boardService.selectBoardList();
//list라는 이름으로 뷰에서 사용할 수 있다.
mv.addObject("list",list);
return mv;
}
게시판 전체목록을 불러올때 int i = 10 / 0; 을 넣어주고 /board/openBoardList.do 를 호출하면
다음처럼 ArithmeticException이 발생하고 이 에러와 관련된 로그가 출력되는 것을 볼 수 있다.
'JAVA SPRING' 카테고리의 다른 글
@Transactional (0) | 2021.06.03 |
---|---|
Spring WebFlux란? (0) | 2021.05.29 |
Spring Version( 스프링 버전 별 특징, 차이) (2) | 2021.05.25 |
Maven vs Gradle (0) | 2021.04.20 |
스프링 Component Scan (0) | 2021.04.12 |