카테고리 없음

스프링 예외 처리

Seojoo21 2022. 2. 8. 23:37

0. 컨트롤러 메서드 내에서 try-catch 로 처리 

- 자바에서의 try-catch와 동일하다.

 

1. @ControllerAdvice 와 @ExceptionHandler 

- 아래 글의 6. Controller의 Exception 처리 참고

https://seojoo21.tistory.com/41?category=995432 

 

스프링 MVC의 Controller

*출처: Chapter06 스프링 MVC의 Controller, 코드로 배우는 스프링 웹 프로젝트 개정판, 구멍가게 코딩단, 남가람북스 스프링 MVC를 이용하는 경우 작성되는 Controller는 다음과 같은 특징이 있다. - HttpServl

seojoo21.tistory.com

 

2. @ResponseStatus

- 응답 메세지의 상태 코드를 변경할 때 사용

* 예외의 디폴트 상태 코드는 500번 Internal Server Error임. 

 

1) 예외 처리 메서드 앞에 붙인다.

@ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED) // 상태코드 200을 400번대로 바꾼다. 여기서는 "405 Method Not Allowed."로 바꿈
@ExceptionHandler({NullPointerException.class, FileNotFoundException.class})
public String catcher2(Exception ex, Model m) {
	m.addAttribute("ex", ex);
	return "error"; // view 폴더 내 error.jsp 가 실행. 상태코드는 200 (요청 처리 성공) 
}

 

2)사용자 정의 예외 클래스 앞에 붙인다. 

@ResponseStatus(HttpStatus.BAD_REQUEST) // 400 Bad Request.
class MyException extends RuntimeException {
	MyException(String msg){
    	super(msg);
    }

	MyException() {
    	this("");
    }
}

 

3. web.xml에 <error-page> 태그 추가 (상태 코드별 뷰 맵핑

 

-  web.xml 파일 내에 아래와 같이 코드를 추가하여 에러 페이지 형식과 내용을 원하는대로 바꿀 수 있다.

	<error-page>
		<error-code>400</error-code>
		<location>/error400.jsp</location>
	</error-page>
	<error-page>
		<error-code>500</error-code>
		<location>/error500.jsp</location>
	</error-page>

- 위와 같이 코드를 추가한 다음에는  view 폴더 내에 error400.jsp, error500.jsp 파일을 만들어야 한다. 

//error400.jsp 

<%@ page contentType="text/html;charset=utf-8" isErrorPage="true"%> 
//isErrorPage="true"는 이 jsp 파일이 ErrorPage라는 것을 의미하며 디폴트값으로 상태코드 500을 가진다.
//"true" 대신 "false"로 하면 상태코드가 500으로 바뀌지 않는다. 
[400] 잘못된 오류입니다. 확인 후 다시 한번 요청해주세요.

 

4. servelet-context.xml에 SimpleMappingExceptionResolver 추가 (예외 종류별 뷰 맵핑에 사용

- servlet-context.xml에 아래와 같이 코드를 등록하여 에러 처리를 할 수도 있다.

- 예외 처리 메서드가 특별히 할 일이 없을 때는 뷰만 리턴하면 되므로 굳이 예외 처리 메서드를 만들 필요가 없을때 사용한다.

 (<view-controller>와 비슷) 

<beans:bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
	<beans:property name="defaultErrorView" value="error"/>
    <beans:property name="exceptionMappings">
    	<beans:props>
        	<beans:prop key="com.xxx.xxx.MyException">error400</beans:prop>
            		    //패키지명.예외 종류를 적는다.      에러뷰를 적는다. 
       	</beans:props>
    </beans:property>
    <beans:property name="statusCodes">
    	<beans:props>
        	<beans:prop key="error400">404</beans:prop>
            //뷰에 대한 상태코드를 무엇을 할 것인지 정한다. 여기서는 200이 나오지 않고 404가 나온다.
        </beans:props>
    <beans:property>
</beans:bean>