[Spring] 예외 처리

Posted by 신희준 on December 27, 2017

2017 - 12 - 27 (화)


HTTP 상태별 번호

  • 100 : 데이터의 일부를 서버가 받은 상태이다.

  • 200 : 정상적인 응답을 받은 상태로
  • 204 : 정상처리되었으나 서버에서 보내줄 데이터가 없을 경우이다.

  • 301 : 요청된 페이지가 새로운 URL로 변경됨 ( Redirect 했을 시에 발생 )
  • 304 : 이미 기존의 데이터와 변경된 것이 없음

  • 400 : 전송된 Request 문제 (Bad Request exception)
  • 403 : 서버에서 허락되지 않은 경우
  • 404 : URL에 해당 소스를 찾을 수 없을 경우 (File not found exception)
  • 406 : 전송 방식이 허락되지 않을 경우

  • 500 : 서버단의 문제 ( 권한 문제 )
  • 502 : 게이트웨이나 프락시 서버 의 과부하
  • 503 : 일식적인 과부하 및 서비스 중단
  • 504 : 지정된 처리시간이 지나서 처리되지 못함.

Spring 예외 처리


예외처리하고자 하는 상황은 500대의 에러가 발생했을 경우 메인화면으로 보낸 후 에러상황을 표현하는 모달창을 띄우는 것이다.

  • @ControllerAdvice 애너테이션의 활용

예외처리의 경우 @ExceptionHandler , @ControllerAdvice, @ResponseStatus 등의 에너테이션을활용할 수 있다.

  • @ControllerAdvice 애너테이션을 활용하는 형태이다.
@ControllerAdvice
public class CommonExceptionAdvice {

	private static final Logger logger = LoggerFactory.getLogger(CommonExceptionAdvice.class);

	@ExceptionHandler(Exception.class)
	public modelAndView common(Exception e) {
		logger.info(e.toString());

    ModelAndView mv = new ModelAndView();
    mv.setViewName("index");
    mv.addObject("exception", e);

		return mv;
	}
}
  • @ControllerAdvice 애너테이션을 붙임으로서 해당 클래스가 상기 웹프로젝트의 예외를 처리하는 클래스임을 명시합니다. common() 메서드를 활용하여 공통적인 예외를 처리합니다.


  • 특히 @ControllerAdvice 클래스의 메서드의 경우 매개변수로 Exception 객체의 타입만 받을 수 있도록 정해져있기에 반환타입을 ModelAndView 로 반환 페이지에 특정 메시지를 함께 보낼 수 있습니다.


(전에 ModelAndView 와 Model 을 따로 나누는 이유가 이러한 부분 때문이란 것을 알게됨)

  • 위 컨트롤러에서는 메인화면으로 보내게 되며, 메인페이지에서는 exception 애트리뷰트의 값이 있을 경우 로그인 모달을 띄워주면된다.

  • 위의 CommonExceptionAdvice 컨트롤러는 공통적인 예외 상황을 담으므로 특정 예외를 다루고자 하면 해당 예외상황에 대한 메서드를 작성해줘야한다.

에러페이지 처리


404 , 400 , 403 , 500 등 몇가지 에러가 발생할 가능성이 있다. 이 때 유저들에게 친근한 화면을 보여줄 수 있도록 사전에 만들어놓은 에러상황의 페이지로 보내준다.

스프링에서는 web.xml 에 특정 코드의 에러상황에 따라 반환해주는 jsp 페이지를 설정해줄 수 있다.


<error-page>
<error-code>400</error-code>
<location>/WEB-INF/views/error/400error.jsp</location>
</error-page>

<error-page>
<error-code>403</error-code>
<location>/WEB-INF/views/error/403error.jsp</location>
</error-page>

<error-page>
<error-code>404</error-code>
<location>/WEB-INF/views/error/404error.jsp</location>
</error-page>

<error-page>
<error-code>500</error-code>
<location>/WEB-INF/views/error/500error.jsp</location>
</error-page>

<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/WEB-INF/views/error/error.jsp</location>
</error-page>