-
[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
글을 읽으시면서 잘못된 부분이나 궁금하신 사항은 댓글 달아주시면 빠른 시일내에 수정 및 답변하도록 하겠습니다.
'Spring > 게시판 만들기' 카테고리의 다른 글
[Camel][Spring] 게시판 만들기 #5-2. 페이징 처리 (Paging) 추가 사항 (0) 2020.06.26 [Camel][Spring] 게시판 만들기 #5-1. 페이징 처리 (Paging) (0) 2020.06.26 [Camel][Spring] 게시판 만들기 #3. 게시판 글 쓰기,수정 삭제 (4) 2020.06.25 [Camel][Spring] 게시판 만들기 #2. BootStrap 템플릿 적용 (2) 2020.06.25 [Camel][Spring] 게시판 만들기 #1. 프로젝트 생성 & 세팅 (2) 2020.06.25