@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를 잘 활용하면 예외처리에 많은 도움이 될 것으로 보인다.
댓글