어노테이션을 이용한 에러 처리에 대한 코드를 보다가 @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됨을 확인할 수 있다.
'[IT] > Spring' 카테고리의 다른 글
[Spring][Lombok] STS3에 Lombok 라이브러리 설치 및 적용하기 (Windows) (0) | 2021.11.21 |
---|