스프링

[Spring MVC] Exeption 처리방법 - @ControllerAdvice, @ExceptionHandler

du.study 2019. 11. 19. 23:24
728x90

저번 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를 입력할 수 있습니다.

 

728x90