열심히 끝까지

디바이스 융합 자바(Java) day75 - 에러 페이지 설정 본문

디바이스 융합 자바(Java)기반 풀스택 개발자 양성과정(수업내용)

디바이스 융합 자바(Java) day75 - 에러 페이지 설정

노유림 2022. 9. 28. 15:17

> 예외는 언제 발생하는가?

     : 없는 아이디. null값 등을 아이디에 로그인 시도 하였을 때, 에러 발생

       > required로 에러를 발생하지 않도록 만드는게 에러처리

       > 에러가 나도 null넣었다는 페이지를 보여주는 것이 에러 페이지 설정

 

>> 에러 페이지 설정 VS 에러 처리

 

- 에러처리

       : 에러 자체가 발생되지 않게 선 처리(유효성 검사)

       : 에러가 발생하더라도, 넘어갈 수 있게(try-catch) 처리

 

- 에러 페이지 설정

       : 에러는 발생할 수 있음

       : 에러 발생 시,

            1. 왜 발생했는지

            2. 어디로 가야하는지 안내

        해주는 페이지

            ex ) 웹툰 - 유료 웹툰 페이지

 

 

>> 에러 페이지 설정

     1) @(어노테이션 설정)   

     2) xml 설정

 

1) @(어노테이션) 설정

        : 생각보다 @으로 설정하지 않음 == 복잡하기 때문
        : @으로 사용하려면 예외처리 클래스를 1개 이상 만들어야 함
      > @ControllerAdvice 
      > @ExceptionHandler : 요청에 대한 처리를 할 때

  >> 예외 클래스를 만들어서 설정해야 함
      : @을 쓰려면 그렇게 해야 함

 

 

      1. @을 앞으로 사용할 예정이라고 설정파일(.xml)에게 알려주어야 함(DispatcherServlet-servlet.xml)

          >> namespaces에 mvc 추가

 xmlns:mvc="http://www.springframework.org/schema/mvc"

          com.ryo.biz의 common에 넣을 예정==공통패키지
               그렇게 때문에 base-package를 com.ryo.biz로 설정
               [과거에는 com.ryo.biz.controller 였음]

      2. 예외 관련된 것을 보관할 페이지 작성 
           매핑해서 쓰려면 객체 필요!!
           >> 객체화 해주는 @인 @ControllerAdvice 사용
                    : CommonExceptionHandler를 객체화해주는 @
                    : 횡단관심사처럼 처리해 줌
                     사용 방법 : @ControllerAdvice(오류 범위 입력) 
                    : ExceptionHandler가 연결해 줌

 

 

CommonExceptionHandler.java-----------------

package com.ryo.biz.common;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;

@ControllerAdvice("com.ryo.biz")
public class CommonExceptionHandler {
	
	@ExceptionHandler(NullPointerException.class) 
	public ModelAndView aException(Exception e) { // nullpointerException
		ModelAndView mav = new ModelAndView();
		mav.addObject("exception", e);
		mav.setViewName("/error/error.jsp");
		return mav; // 어떤 에러가 발생했는지 전달해주고 싶어서
	}
	
	@ExceptionHandler(ArithmeticException.class)
	public ModelAndView bException(Exception e) { // 수학적인 문제
		ModelAndView mav = new ModelAndView();
		mav.addObject("exception", e);
		mav.setViewName("/error/error.jsp");
		return mav; // 어떤 에러가 발생했는지 전달해주고 싶어서
	}
	
	@ExceptionHandler(Exception.class)
	public ModelAndView cException(Exception e) { // 미확인
		ModelAndView mav = new ModelAndView();
		mav.addObject("exception", e);
		mav.setViewName("/error/error.jsp");
		return mav; // 어떤 에러가 발생했는지 전달해주고 싶어서
	}
}

 

error.jsp-------------------------------------------------

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isErrorPage="true" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 무슨 에러가 났는지 확인하는 메시지 -->
<h1>${exception.message}</h1>
<a href="login.do">go to login</a>

</body>
</html>

 



2) XML 설정
        : 간편하게 설정 가능
        : 별도로 예외처리 클래스를 만들지 않아도 사용 가능

 

DispatcherServlet-servlet.xml 파일에 다음 문장 추가

<!-- 예외 페이지 설정 -->
<bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> 
	<property name="exceptionMappings">
		<props>
			<prop key="java.lang.NullPointException">error/error.jsp</prop>
			<prop key="java.lang.ArithmeticException">error/error.jsp</prop>
			<prop key="java.lang.Exception">error/error.jsp</prop>
		</props>
	</property>
</bean>