[Spring MVC] Exeption 처리방법 - @ControllerAdvice, @ExceptionHandler
저번 Exeption처리 방법으로 AbstractHandlerExceptionResolver를 사용하는 방법으로 포스팅을 한 적이 있습니다.
관련 글 : https://duooo-story.tistory.com/15
이번에는 @ControllerAdvice, @ExceptionHandler 를 사용한 Exception방법에 대해서 기록하려 합니다.
먼저 @ControllerAdvice 는 전역 컨트롤러로 불러며, 컨트롤러 공통적으로 사용할 것이 있을때, 해당 어노테이션을 사용할 수 있습니다. 예를 들면 다음과 같은 상황에서 사용할 수 있습니다.
1. Exception 처리
2. @InitBinder를 이용한 설정세팅 ( 이전 포스팅에서 언급한 적이 있지만, 너무 다양한 기능을 지원해주기에 추후에 포스팅으로 작성할 예정입니다.)
3. @ModelAttribute 를 이용한 컨트롤러 공통 데이터 세팅
이번에는 예외처리를 이용하는 테스트를 위해 @ExceptionHandler를 사용하겠습니다.
먼저 해당 어노테이션을 선언하는 class를 생성합니다.
@GetMapping("/common-error")
@ResponseBody
public String commonErrorTest(){
throw new CommonException();
}
@RestControllerAdvice
public class CommonController {
@ExceptionHandler(CommonException.class)
public ResponseEntity<BaseDomain> commonErrorException(CommonException ex){
BaseDomain baseDomain = new BaseDomain(ex.getErrorType().getErrorCode(),ex.getErrorType().getErrorMsg());
return ResponseEntity.badRequest().body(baseDomain);
}
}
public class BaseDomain {
private Integer errorCode;
private String errorMsg;
public BaseDomain(Integer errorCode, String errorMsg){
this.errorCode = errorCode;
this.errorMsg = errorMsg;
}
.....
}
public class CommonException extends RuntimeException {
protected ErrorCodable errorType;
protected String causeMsg;
public CommonException() {
this.errorType = ErrorType.UNKNOWN_ERROR;
}
.....
}
public enum ErrorType implements ErrorCodable{
SUCCESS(0, "SUCCESS", 500),
INVALID_VALUE(1000, "INVALID_VALUE",403),
UNKNOWN_ERROR(9999,"UNKNOWN_ERROR",500)
;
.....
}
에러를 발생시키기위해 컨트롤러 /common-error를 호출하여 throw new CommonException();를 통하여 강제로 에러를 뱉게 하였습니다.
해당 CommonException에러를 @RestControllerAdvice를 속의 @ExceptionHandler(CommonException.class) 가 캐치하게되고, ResponseEntity를 통하여 http status변경 및 코드와 body를 심어서 다음과 같은 결과를 리턴받게 됩니다.
해당 예재에서는 badRequest같은 함수를 사용하였지만 직접 HttpStatus를 입력할 수 있습니다.