프로그래밍/Spring & Spring boot

[Spring/스프링] SimpleMappingExceptionResolver / @ExceptionHandler 사용하여 예외 처리

pupu91 2022. 9. 7. 17:41
반응형

SimpleMappingExceptionResolver를 이용한 방식(전역)

 


 

1 .  NullPointerException 테스트

 

main.jsp 에 버튼 클릭시 이동할 경로 설정

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	
	<h1 align="center">Exception Handler 사용하기</h1>
	
	<h3> SimpleMappingExceptionResolver를 이용한 방식(전역)</h3>
	<button onclick="location.href='simple-null'"> NullPointerException 테스트 </button>
	<button onclick="location.href='simple-user'"> 사용자 정의 Exception 테스트 </button>

</body>
</html>

 

 

 

 

nullPointer.jsp에 오류시 나타나는 메세지 작성

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	
	<h1 align="center"> ♥ 널 위하여 NullPointerException 발생 ♥</h1>
	
</body>
</html>

 

 

 

 

 

Controller파일의 핸드메소드에 테스트를 위해 일부러 오류 만들기

@Controller
public class ExceptionHandlerController {
	
    @GetMapping("/simple-null")
	public String simpleNullPointerExceptionTest() {
    	
		String str = null;
		System.out.println(str.charAt(0));
        
        return "main";
    
    }

 

 

 

 

root-context.xml에 SimpleMappingExceptionResolver bean 등록

:  SimpleMappingExceptionResolver는 requestScope에 값을 담아주기 때문에 addAttribute하지 않아도 됨

   key - 예외 클래스명 작성 (풀 클래스명을 작성해도 되고 클래스명만 작성해도 된다)

   value -경로 작성

  (view resolver가 해석 시 InternalResourceViewResolver를 이용하기 떄문에 prefix/suffix 고려해서 경로를 작성한다.) 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
	
    
    빈등록
    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    	<property name="exceptionMappings"> 
        <props>
              <prop key="java.lang.NullPointerException"> error/nullPointer </prop>	
              => error/nullPointer.jsp
	</props>
       </property>
    </bean>

 

 

 

 

화면 결과

 

 

 

 

 


2. 사용자 정의 Exception 테스트

 

 

memberRegist.jsp에 오류시 나타나는 메세지를 requestScope로 꺼내올 수 있도록 작성

ㄴ<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<!-- requestScope가 exception값에 접근할 수 있음. -->
	<h1 align="center">${ requestScope.exception.message }</h1>

</body>
</html>

 

 

 

 

 

root-context.xml에 SimpleMappingExceptionResolver bean 등록

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
	
    
    빈등록
    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    	<property name="exceptionMappings"> 
        <props>
            <prop key="MemberRegistException"> error/memberRegist </prop>	
	</props>
       </property>
    </bean>

 

 

 

 

 

핸들러 메소드 작성

@Controller
public class ExceptionHandlerController {

	@GetMapping("/simple-user")
	public String simpleUserExceptionTest() throws MemberRegistException {
		
		boolean check = true;
		if(check) {
			throw new MemberRegistException("당신 같은 사람은 회원으로 받을 수 없습니다!"); 
            throw 했기 떄문에 클래스 생성시 자동으로 Exception 상속받게 작성됨
		} 
		
		return "main";		
	}
}

 

 

 

 

MemberRefistException 클래스 생성

public class MemberRegistException extends Exception {

	public MemberRegistException() {}
	
	public MemberRegistException(String msg) {
		super(msg); //Exception생성자에 전달->throwable에 전달
	}	
}

 

 

 

 

화면 결과

=> addAttribute하지 않아도  SimpleMappingExceptionResolver가  requestScope에 값을 담아주어 메세지 출력 가능

 

 

 

 


 

@ExceptionHandler 어노테이션을 이용한 방식(클래스별)

 


 

1. NullPointerException 테스트

 

 

nullPointer.jsp에 오류시 나타나는 메세지 작성

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	
	<h1 align="center"> ♥ 널 위하여 NullPointerException 발생 ♥</h1>
	
</body>
</html>

 

 

 

 

@ExceptionHandler사용하여 핸들러 메소드 작성

@Controller
public class ExceptionHandlerController {	
   
    전역과 지역적인 메소드가 있을때 누가 동작될까? =>지역적인 메소드가 우선
    @GetMapping("annotation-null")
	public String annotationNullPonterException() {
		
		String str = null;
		System.out.println(str.charAt(0));
		
		return "main";
		
	}
	
	@ExceptionHandler(NullPointerException.class) 
	public String nullPointerExceptionHandler(NullPointerException exception) { 
		
		System.out.println("@ExceptionHandler 메소드 호출");
		System.out.println(exception.getMessage());
		return "error/nullPointer";
	}

 

 

 

 

2.  사용자 정의 Exception 테스트

: 지역적인 메소드는 메소드 안에 구문만 동작하기 때문에 root-context에 설정 한 값에 영향받지 않음.

  model.addAttribute로 requestScope에 담아야함!!

 

 

memberRegist.jsp에 오류시 나타나는 메세지를 requestScope로 꺼내올 수 있도록 작성

ㄴ<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<!-- requestScope가 exception값에 접근할 수 있음. -->
	<h1 align="center">${ requestScope.exception.message }</h1>

</body>
</html>

 

 

 

 

@ExceptionHandler사용하여 핸들러 메소드 작성

@Controller
public class ExceptionHandlerController {

    @GetMapping("annotation-user")
	public String annotationUserExceptionTest() throws MemberRegistException {
		
		boolean check = true;
		if(check) {
			throw new MemberRegistException("당신 같은 사람은 회원으로 받을 수 없어~~~");
			
		}
		
		return "main";
	}
	
	@ExceptionHandler(MemberRegistException.class)
	public String userExceptionHandler(MemberRegistException exception, Model model) {
		
		System.out.println("@ExceptionHandler 메소드 호출");
		System.out.println(exception.getMessage());
		model.addAttribute("exception", exception);
		return "error/memberRegist";
	} 
	
}

 

 

 

화면 결과

 

반응형