[Camel][Spring] 게시판 만들기 #4. 예외처리 (Exception)
[Camel][Spring] 게시판 만들기 #4. 예외처리 (Exception)
본 게시판 만들기 프로젝트는 더블에스 Devlog Spring-MVC 를 참조하여 작성했음을 알려드립니다. 또한 개인적인 학습을 목적으로한 포스팅이기 때문에 완벽하지 않을 수 있음을 알려드립니다. 문제점이나 궁금한점은 댓글로 남겨주시면 감사하겠습니다. 프로젝트 생성에 앞서 이번 게시판 만들기 프로젝트는 이클립스를 사용하여 구현하였습니다.
1. 예외처리
Spring에서 뿐만아니라 예외처리는 프로그래밍이라는 부분에 있어서 매우 중요한 부분이여 까다로운 부분이라고 할 수 있습니다. 예외처리를 보다 상세하고 다양하게 한다면 우리는 더욱 더 안적적인 프로그램을 만들 수 있습니다.
Spring에서는 예외처리를 위한 다양한 애노테이션들을 제공하고 있습니다. 대표적인 애노테이션으로는 @ControllerAdvice 애너테이션과 @ExceptionHandler 애너테이션이 있으며, 이번 게시판 프로젝트에서는 그 중 가장 범용적으로 사용가능한 @ControllerAdvice 애너테이션을 활용하여 예외처리를 구현하겠습니다.
1-1. @ExceptionHandler 애너테이션
이번 프로젝트에서는 사용하지는 않지만 간단히 설명하자면, @ExceptionHandler 애너테이션은 @Controller, @RestController가 적용된 Bean내에서 발생하는 예외를 잡아서 하나의 메서드에서 처리해주는 기능을 하는 애너테이션입니다. 사용방법은 아래와 같이 간단하게 사용할 수 있으며 파라미터로 캐치하길 원하는 Exception을 명시해주면 됩니다. 또한, 캐치하길 원하는 Exception은 한가지만 명시가능한 것이아니라 다수로 명시도 가능합니다.
@RestController
public class BlaBlaController {
...
...
@ExceptionHandler(NullPointerException.class)
public Object nullExcept(Exception e) {
System.err.println(e.getClass());
return "myService";
}
}
@ExceptionHandler 애너테이션을 사용함에 있어서 주의해야할 점으로는 @Controller, @RestController에만 적용이 가능하다는 점입니다. 추가적으로, @ExceptionHandler 애너테이션을 등록한 컨트롤러에만 적용이되며, 다른 컨트롤러에서 Exception이 발생하더라도 예외처리를 할 수 없습니다.
1-2. @ControllerAdvice 애너테이션
@ExceptionHandler 애너테이션이 하나의 클래스를 대상으로 한다면 @ControllerAdvice 애너테이션은 모든 컨트롤러를 대상으로 합니다. @ControllerAdvice 애너테이션은 모든 컨트롤러에서 발생할 수 있는 예외를 처리해주는 애너테이션입니다. 사용방법 및 설명은 아래에서 이어서 하도록 하겠습니다.
2. CommonExceptionAdvice 클래스 작성
/src/main/java/기본패키지/commons/exception패키지를 생성하고, CommonExceptionAdvice클래스를 아래와 같이 작성해줍니다. 클래스 내부를 살펴보면 @ControllerAdvice 애너테이션을 사용하기 위해 commonException 메소드 선언부에 @ExceptionHandler 애너테이션을 붙여 적절한 타입의 예외처리를 수행하도록 하였습니다.
package com.cameldev.mypage.commons.exception;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;
@ControllerAdvice
public class CommonExceptionAdvice {
private static final Logger logger = LoggerFactory.getLogger(CommonExceptionAdvice.class);
@ExceptionHandler(Exception.class)
public ModelAndView commonException(Exception e) {
logger.info(e.toString());
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("exception", e);
modelAndView.setViewName("/commons/common_error");
return modelAndView;
}
}
여기서 한가지 주의할 점은 이 클래스는 일반 컨트롤러 클래스와는 다르게 Model 타입을 파라미터로 사용하는 것은 허용하지 않기때문에 ModelAndView 타입을 사용한다는 점입니다. ModelAndView 타입은 하나의 객체로 Model 데이터와 View를 동시에 처리가능한 객체입니다.
3. common_error.jsp 작성 (예외 출력 페이지)
/WEB-INF/views 디렉토리에 commons 디렉토리를 생성하고, common_error.jsp파일을 생성한 뒤 아래와 같이 작성해주도록 하겠습니다.
<%@ page contentType="text/html; charset=UTF-8" language="java" %>
<!DOCTYPE html>
<!--
This is a starter template page. Use this page to start your new project from
scratch. This page gets rid of all links and provides the needed markup only.
-->
<html lang="en">
<%@ include file = "../include/head.jsp" %>
<body class="hold-transition sidebar-mini">
<div class="wrapper">
<!-- Navbar -->
<%@ include file = "../include/main_header.jsp" %>
<!-- /.navbar -->
<!-- Main Sidebar Container -->
<%@ include file = "../include/left_column.jsp" %>
<!-- Content Wrapper. Contains page content -->
<div class="content-wrapper">
<!-- Main content -->
<div class="content">
<div class="container-fluid">
<section class="content container-fluid">
<h3><i class="fa fa-warning text-red"></i> ${exception.getMessage()}</h3>
<ul>
<c:forEach items="${exception.getStackTrace()}" var="stack">
<li>${stack.toString()}</li>
</c:forEach>
</ul>
</section>
</div><!-- /.container-fluid -->
</div>
<!-- /.content -->
</div>
<!-- /.content-wrapper -->
<!-- Control Sidebar -->
<aside class="control-sidebar control-sidebar-dark">
<!-- Control sidebar content goes here -->
<div class="p-3">
<h5>Title</h5>
<p>Sidebar content</p>
</div>
</aside>
<!-- /.control-sidebar -->
<!-- Main Footer -->
<%@ include file = "../include/main_footer.jsp" %>
</div>
<!-- ./wrapper -->
<!-- REQUIRED SCRIPTS -->
<%@ include file = "../include/plugin_js.jsp" %>
</body>
</html>
4. 예외처리 확인
위의 과정을 모두 수행했다면 브라우저에 아래와 같은 url을 직접입력하여 고의로 예외를 발생시켜보도록 하겠습니다.
http://localhost:8080/mypage/article/read?article_no=4asdfasfh
위의 모든 과정이 정상적으로 수행되었다면, 예외 발생 시 예외를 처리하고 어떤 예외가 발생했는지를 브라우저에서 확인 할 수 있을 것입니다. 이러한 작업은 개발과정에서 예외 발생시 빠르게 원인을 파악할 수 있도록 도와주지만, 실제 서버에 배포하고 서비스할 때에는 이런 화면을 보여주는 것은 좋지 않습니다. 개발과정에서만 사용하세요~
5. 포스팅을 마치며
이번 포스팅에서는 예외처리에 대해 알아보았습니다. 다음 포스팅에서는 게시물 목록 페이지에서의 페이징 처리에 대해 포스팅하도록 하겠습니다.
다음포스팅
2020/06/26 - [Spring/게시판 만들기] - [Camel][Spring] 게시판 만들기 #5-1. 페이징 처리 (Paging)
[Camel][Spring] 게시판 만들기 #5-1. 페이징 처리 (Paging)
[Camel][Spring] 게시판 만들기 #5. 페이징 처리 (Paging) 본 게시판 만들기 프로젝트는 더블에스 Devlog Spring-MVC 를 참조하여 작성했음을 알려드립니다. 또한 개인적인 학습을 목적으로한 포스팅이
cameldev.tistory.com