YONG-MIN

[설정] 오류 공통 페이지 설정

개발언어/Java, Spring 2017. 11. 26. 12:20

이런 설정 관련 부분들이 이미 만들어진 Spring 구조에 개발할 때엔 알지 못했던 부분인것 같습니다.

흔히 발생하는 오류(400, 404, 500 등...)가 생겼을때 따로 정의해둔 페이지로 연결하는 설정방법입니다.

Spring에서는 이를 위해 Jsp에 직접 선언할수도, Web.xml을 이용해 선언할 수도 있습니다.

Jsp에 설정하는 방법은 모든 Jsp에 대해 수행해야 하는 방법이므로 권장하지 않습니다.

이번 포스팅에선 Web.xml에 설정해서 사용하는 방법을 다루고,

그 안에서 몇가지 응용방법에 대해 포스팅하겠습니다.

1. 오류 페이지 호출 우선순위

오류 페이지를 호출하기 위한 설정은 JSP에서 선언하는 방법, Web.xml에 Exception-type을 사용하는 경우, Error-code를 사용하는 경우로 다양합니다.

이런 방법으로 선언된 오류 페이지의 호출 우선순위는 다음과 같습니다.



2. 발생오류에 관한 정보의 종류 및 사용예시

2.1. 오류정보 종류
  - javax.servlet.error.status_code (오류 상태 코드)
  - javax.servlet.error.exception_type (예외처리 클래스)
  - javax.servlet.error.message (오류 메시지)
  - javax.servlet.error.request_uri (오류가 발생한 요청 URI)
  - javax.servlet.error.exception (발생한 예외처리 내용)
  - javax.servlet.error.servelt_name (오류가 발생한 Servlet)

2.2. 사용예시
2.2.3. Java
log.info("STATUS_CODE : "+request.getAttribute("javax.servlet.error.status_code"));
log.info("EXCEPTION_TYPE : "+request.getAttribute("javax.servlet.error.exception_type"));
log.info("MESSAGE : "+ request.getAttribute("javax.servlet.error.message"));
log.info("REQUEST_URI : "+ request.getAttribute("javax.servlet.error.request_uri"));
log.info("EXCEPTION : "+ request.getAttribute("javax.servlet.error.exception"));
log.info("SERVLET_NAME : "+ request.getAttribute("javax.servlet.error.servlet_name"));
2.2.4. Jstl
 
 
 
 
 
 

2. Web.XML

2.1. 간단한 사용예시
특정 오류가 발생했을때 만들어둔 오류페이지로 이동시키기 위해 아래와 같은 코드를 추가합니다. 
코드 자체가 직관적이어서 별다른 설명은 필요 없어보입니다.
말그대로 error_code에 기재된 오류가 발생시 location에 설정한 페이지를 보여주게 됩니다.

	404
	/WEB-INF/jsp/error/error404.jsp

500 /WEB-INF/jsp/error/error500.jsp


이런 단순한 페이지 오류 말고도 필요한 경우에 아래처럼 Java Exception에 대해서도 설정이 가능합니다.

	
		 Java Exception Class명 
		JSP 절대경로 or Controller에 선언된 URL Mapping 주소 
	


2.2. 응용 (Spring 3.x부터 추가된 PathVariable 사용)

Spring3에서 추가된 기능 @Pathvariable 어노테이션을 이용해 오류를 보다 효율적으로 처리가능합니다.

Pathvariable이란 말처럼 경로(Path)에 변수(Variable)을 넣어주는 기능입니다. 

다소 생소할 수 있는 Pathvariable 기능이기 때문에 Controller부터 설명합니다.



2.2.1. Controller

	@RequestMapping(value="/common/error{error_code}.do")
	public ModelAndView error(HttpServletRequest request, @PathVariable String error_code) {
		ModelAndView mv = new ModelAndView("/common/error");
		String msg = (String) request.getAttribute("javax.servlet.error.message"); 
		
		Map map = new HashMap();
		map.put("STATUS_CODE", request.getAttribute("javax.servlet.error.status_code"));
		map.put("REQUEST_URI", request.getAttribute("javax.servlet.error.request_uri"));
		map.put("EXCEPTION_TYPE", request.getAttribute("javax.servlet.error.exception_type"));
		map.put("EXCEPTION", request.getAttribute("javax.servlet.error.exception"));
		map.put("SERVLET_NAME", request.getAttribute("javax.servlet.error.servlet_name"));
		
		try {
			int status_code = Integer.parseInt(error_code);
			switch (status_code) {
			case 400: msg = "잘못된 요청입니다."; break;
			case 403: msg = "접근이 금지되었습니다."; break;
			case 404: msg = "페이지를 찾을 수 없습니다."; break;
			case 405: msg = "요청된 메소드가 허용되지 않습니다."; break;
			case 500: msg = "서버에 오류가 발생하였습니다."; break;
			case 503: msg = "서비스를 사용할 수 없습니다."; break;
			default: msg = "알 수 없는 오류가 발생하였습니다."; break;
			}
		} catch(Exception e) {
			msg = "기타 오류가 발생하였습니다.";
		} finally {
			map.put("MESSAGE", msg);
		}
		
		//logging
    	if(map.isEmpty() == false ) {
    		Iterator> iterator = map.entrySet().iterator();
    		Entry entry = null;
    		while(iterator.hasNext()) {
    			entry = iterator.next();
    			log.info("key : "+entry.getKey()+", value : "+entry.getValue());
    		}
    	}
		
    	mv.addObject("error", map);
		return mv;
	}

가장 중요한 것은 @RequestMapping(value="/common/error{error_code}.do") 부분과 

파라미터인 public ModelAndView error(HttpServletRequest request, @PathVariable String error_code)

이 두가지 부분입니다.

요청변수를 Error_code란 이름으로 받아서 그대로 파라미터로 사용하게 됩니다.

이 변수에 따라 오류에 대한 메시지를 분기해서 입력하는 로직입니다.


2.2.2. Web.xml

  
  
  	java.lang.Throwable
  	/common/errorThrowable.do
  
  
  	java.lang.Exception
  	/common/errorException.do
  
  
  	400
  	/common/error400.do
  
  
  	403
  	/common/error403.do
  
  
  	404
  	/common/error404.do
  
  
  	405
  	/common/error405.do
  
  
  	500
  	/common/error500.do
  
  
  	503
  	/common/error503.do
  
    

Web.xml에선 별다른 내용없이 오류코드에 따라 요청 URL을 "/common/error404.do" 인지 "/common/eror500.do"인지 분리해서 

요청 URL에 입력하여 요청하게 됩니다.


2.2.3. error.jsp

    

${error.MESSAGE }

[HOME] 을 클릭하시면, 홈으로 돌아갑니다.

View Page의 CSS는 본 포스팅의 주제와 맞지 않으므로 생략하고, 핵심은 ModelAndView에 넣어준 error 객체(Map)을 이용하는 부분입니다.

별달리 이해가 필요한 부분이 없어.... 설명할게 없네요...


2.2.4. 결과확인

[Console]


[View]


이상 정상적으로 처리되는 모습을 확인하며, 이번 포스팅을 종료합니다.~!