본문 바로가기

BackEnd/Spring

[코드로 배우는 스프링 웹 프로젝트] ch06 스프링 MVC Controller 3(Controller Exception)

728x90
반응형

https://bobo12.tistory.com/290

 

[코드로 배우는 스프링 웹 프로젝트] ch06 스프링 MVC Controller 1

1. 스프링 MVC 이용시 Controller의 특징 ▷ HttpServletRequest, HttpServletResponse를 거의 사용할 필요 없이 필요한 기능 구현 ▷ 다양한 타입의 파라미터 처리, 다양한 타입의 리턴 타입 사용 가능 ▷ GET, POST

bobo12.tistory.com

 

https://bobo12.tistory.com/291

 

[코드로 배우는 스프링 웹 프로젝트] ch06 스프링 MVC Controller 2

https://bobo12.tistory.com/290 [코드로 배우는 스프링 웹 프로젝트] ch06 스프링 MVC Controller 1 1. 스프링 MVC 이용시 Controller의 특징 ▷ HttpServletRequest, HttpServletResponse를 거의 사용할 필요 없이 필요한 기능

bobo12.tistory.com

 

 

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는 자바를 이용하는 것이 많은 것 같네요!

 

많은 분들의 피드백은 언제나 환영합니다!  많은 댓글 부탁드려요~~

 

728x90
반응형