https://bobo12.tistory.com/290
https://bobo12.tistory.com/291
6. Controller의 Exception 처리
▷ 예외 발생시 처리 방법
▶ @ExceptionHandler, @ControllerAdvice를 이용한 처리
▶ @ResponseEntity를 이용하는 예외 메시지 구성
(1) @ControllerAdvice
▷ AOP(Aspect-Oriented-Programming)를 이용하는 방식
▷ AOP는 프로그램에서 필요한 공통적인 관심사(cross-concern)는 분리하자는 개념
▷ Controller 작성시 메소드의 모든 예외사항을 전부 핸들링 하면 많은 양의 코드가 필요하지만
AOP 방식을 이용하면 공통적인 예외사항에 대해서는 별도로 @ControllerAdvice를 이용해서 분리하는 방식
◎ 패키지 및 CommonExceptionAdvice 클래스 생성
◎ CommonExceptionAdvice 클래스 내용package org.codehows.exception; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import lombok.extern.log4j.Log4j; @ControllerAdvice @Log4j public class CommonExceptionAdvice { @ExceptionHandler(Exception.class) public String except(Exception ex, Model model) { log.error("Exception......" + ex.getMessage()); model.addAttribute("exception", ex); log.error(model); return "error_page"; } }
▷ @ControllerAdvice는 객체가 스프링의 컨트롤러에서 발생하는 예외를 처리하는 존재임을 명시하는 용도
▷ @ExceptionHandler는 해당 메소드가 들어가는 예외 타입을 처리하는 것을 의미
▶ 어노테이션 속성으로는 Exception 클래스 타입을 지정할 수 있음
▷ 특정 타입의 예외를 다루고 싶다면 Exception.class 대신 구체적인 예외 클래스 지정 필요
▷ 구체적인 메시지를 보고 싶다면 Model을 이용해서 전달
◎ servlet-context.xml 파일 수정
...(생략)... <context:component-scan base-package="org.codehows.controller" /> <context:component-scan base-package="org.codehows.exception" /> </beans:beans>
▷ CommonExceptionAdvice의 except() 리턴값은 문자열이므로 JSP 파일의 경로가 됨
◎ error_page.jsp 생성<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ page session="false" import="java.util.*" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html" charset="UTF-8"> <title>Insert title here</title> </head> <body> <h4><c:out value="${exception.getMessage()}"></c:out></h4> <ul> <c:forEach items="${exception.getStackTrace() }" var="stack"> <li><c:out value="${stack}"></c:out></li> </c:forEach> </ul> </body> </html>
http://localhost:8080/sample/ex04?name=aaa&age=bbb&page=9
고의로 age 값을 문자열로 전송했다면 아래와 같은 오류 페이지가 나타납니다.
(2) 404 에러 페이지
▷ WAS 구동 중 가장 흔한 에러와 관련된 HTTP 상태 코드는 '404', '500' 에러 코드
▷ 500 메시지는 'Internal Server Error'이므로 @ExceptionHandler 이용해서 처리되지만 잘못된 URL을 호출할 때 보이는 404 에러 메시지의 경우 조금 다르게 처리하는 것이 좋음
▷ 스프링 MVC의 모든 요청은 DispatcherServlet을 이용해 처리되므로 404 에러도 같이 처리할 수 있도록 web.xml 수정
◎ web.xml 수정
<!-- Processes application requests --> <servlet> ...(생략)... <init-param> <param-name>throwExceptionIfNoHandlerFound</param-name> <param-value>true</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> ...(생략)...
◎ org.codehows.exception.CommonExceptionAdvice 내용 수정
...(생략)... @ExceptionHandler(NoHandlerFoundException.class) @ResponseStatus(HttpStatus.NOT_FOUND) public String handle404(NoHandlerFoundException ex) { return "custom404"; } }
◎ src/main/webpp/WEB-INF/views → custom404.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html" charset="UTF-8"> <title>Insert title here</title> </head> <body> <h1>해당 URL은 존재하지 않습니다.</h1> </body> </html>
http://localhost:8080/nopage
브라우저에서 존재하지 않는 URL을 호출하면 custom404.jsp 페이지가 나타납니다.
Controller에서 Exception이 발생하면 처리하는 방법에 대해서 다뤄보았습니다.
jsp 파일을 만들어서 특정 예외가 발생했을 시 원하는 페이지가 나오는 것도 가능하네요!!
Controller는 자바를 이용하는 것이 많은 것 같네요!
많은 분들의 피드백은 언제나 환영합니다! 많은 댓글 부탁드려요~~
'BackEnd > Spring' 카테고리의 다른 글
[코드로 배우는 스프링 웹 프로젝트] ch08 영속/비즈니스 계층의 CRUD 구현 1(select, 테이블 출력) (0) | 2023.03.28 |
---|---|
[코드로 배우는 스프링 웹 프로젝트] ch07 스프링 MVC 프로젝트 기본 구성 (0) | 2023.03.27 |
[코드로 배우는 스프링 웹 프로젝트] ch06 스프링 MVC Controller 2 (0) | 2023.03.27 |
[코드로 배우는 스프링 웹 프로젝트] ch06 스프링 MVC Controller 1 (0) | 2023.03.26 |
[코드로 배우는 스프링 웹 프로젝트] ch05 스프링 MVC 기본 구조 (0) | 2023.03.26 |