ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Camel][Spring] 게시판 만들기 #4. 예외처리 (Exception)
    Spring/게시판 만들기 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

     

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

    댓글

Camel`s Tistory.