본문 바로가기
Programming/Java_Spring

@Valid와 @ControllerAdvice 애노테이션

by 곰네Zip 2022. 7. 21.

@Valid애노테이션을 사용하여 전달되는 값의 validation을 수행할 수 있다.

만약 메소드에서 전달받은 이후에 무언가 처리를 하고싶다면 BindingResult를 쓰면 되지만

그냥 Exception이 발생시키도록 했다면.. 어디선가 Exception을 잡아서 처리해줘야 한다.

 

아.. 참고로 @Valid애노테이션은 아래 링크 참조

Java springboo. Validation

메소드 진입 시점에 BindingResult이 없이 @Valid 애노테이션을 붙여서 Validation을 수행하고 만약 invalid하다면.. Exception을 발생시켜준다. (위 링크에도 마지막에 기술해 두었지만 @Valid애노테이션이 붙은 파라미터 바로 다음 파라미터에 BindingResult를 붙여줘야지 안그러면 Exception행이다.)

 

나는 숫자만 들어가있는 문자열을 Validation을 하기 위해 @Pattern(regexpr = "정규식")으로 처리했다.

그랬더니 Exception이 발생했다. BindException. 

근데 이 BindException이 몇개 있다. 그 중에서 org.springframework.validation.BindException을 선택해야 한다.

 

Invalid시 Exception이 발생하는 것은 확인이 되었는데.. 이걸 어디선가 처리해야하니까. 그걸 어떻게 할까..

건건이 ExceptionHandler를 만드는 것도 방법이 되겠으나..

SpringBoot에서는 @ControllerAdvice를 이용하여 처리 가능하다.

 ControllerAdvice는 발생하는 Exception을 모두 가져가 처리해주도록 하는 고마운 애노테이션라고한다.

 

이래저래 찾아보니 @Controller 뿐만 아니라 @RestController에서도 처리 가능하다고 하네?

@ControllerAdvice
public class MyExceptionHandler{
  ...
  @ExceptionHandler(value=Exception.class)
  public ResultType handleException(Exception e){
    //exception처리
  }
  
  @ExceptionHandler(value=BindException.class)
  public ResultType handleBindException(BindException e){
    //exception처리
  }
  
  @ExceptionHandler(value={MyException.class})
  public ResultType handleMyException(MyException e){
    //exception처리
  }
}

 위 코드 중 MyException은 내가 정의한 Exception클래스 (당연히 Exception을 상속받은..)이고.. 저렇게도 사용 가능하다는것. (내가만든 Exception도 처리가능하다.)

 

  BindingResult위치때문에 삽질하다가 알게된건데.. @Valid가 붙은 파라미터는 메소드가 호출되는 시점에 바로 검증을 하여 Exception을 발생시킨다.

 하긴.. BindingResult가 바로 뒤어 붙어 따라오는데 미리 검증해서 확인하지않는다면 BindingResult에 채워줄 내용이 없었겠지?

 

 여튼 ControllerAdvice를 잘 활용하면 예외처리에 많은 도움이 될 것으로 보인다.

반응형

댓글