[IT]/Spring

[Spring] @ControllerAdvice / @Exceptionhandler / @Responsestatus (Spring MVC 에러 처리 관련 어노테이션)

ee2ee2 2021. 12. 20. 23:18
728x90
반응형

어노테이션을 이용한 에러 처리에 대한 코드를 보다가 @exceptionhandler과 @responsestatus 등 언제 어떻게 사용하는 것인가 헷갈려 작성한 글이다.


@ControllerAdvice

: 모든 @Controller, 전역에서 발생할 수 있는 예외를 잡아 처리해주는 역할을 한다.
예외 처리 Class 위에 ControllerAdvice를 붙이고 어떤 예외를 잡아낼 것인지는 각 메소드 상단에 @ExceptionHandler(처리할 Exception.class)를 작성하여 각 Exception 별로 처리할 수 있게 한다.
예)

@ControllerAdvice 
@Log4j 
public class CommonExceptionAdvice { 
	
    ... 생략 

}

@Exceptionhandler

: @Controller, @RestController가 적용된 Bean내에서 지정한 에러가 발생됐을 때 수행되는 Method를 지정할 수 있다. (쉼표(,) 로 구분하여 여러 Exception을 처리할 수도 있음)
예) @ExceptionHandler(Exception.class) : 해당 메소드가 ()에 들어가는 예외타입을 처리한다는 것을 뜻함.
-> 이 경우, Exception.class을 지정하였으므로. 모든 예외에 대한 처리가 except()만을 이용해서 처리할 수 있음.

@ExceptionHandler(Exception.class) 
public String except(Exception ex, Model model) {
	log.error("Exception.........." + ex.getMessage());
	model.addAttribute("exception", ex);
	log.error(model);
	
	return "error_page";
}

@Responsestatus

: Exception이 발생했을 때 응답코드와 메세지를 지정하여 Return할 수 있다.
예)

@ExceptionHandler(NoHandlerFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
//@ResponseStatus(HttpStatus.BAD_GATEWAY) 
public String handler404(NoHandlerFoundException ex) {
	return "error_404";
}

 

<테스트 결과>

테스트 URL : http://localhost:8080/test

@ResponseStatus(HttpStatus.NOT_FOUND) 일 때, Status Code: 404


@ResponseStatus(HttpStatus.BAD_GATEWAY) 일 때, Status Code: 502

 

설정한 @ResponseStatus() 값에 따라 같은 입력값에도 Status Code값이 다르게 Return됨을 확인할 수 있다.