Spring/게시판 만들기

[Camel][Spring] 게시판 만들기 #4. 예외처리 (Exception)

Camelll 2020. 6. 26. 15:13

[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

 

글을 읽으시면서 잘못된 부분이나 궁금하신 사항은 댓글 달아주시면 빠른 시일내에 수정 및 답변하도록 하겠습니다.