@Valid 애노테이션을 사용하면, 전달받는 객체에 대해 검증을 처리할 수 있다.
그리고 BindingResult를 통해서 처리하든, 아니면 바로 BindException을 발생시켜버리든 가능하다.
근데, Exception이 발생한 이후에도 적절한 예외처리를 하거나,
아니면 예외 발생 시, 그에 맞는 메시지를 띄우고싶다면?
그 전에.. @Valid애노테이션을 통해 데이터 검증을 해주는 방법은 아래 포스팅 참고
https://gomnezip.tistory.com/399
여기서는 예외상황별로 메시지를 만드는 것과, 그 exception을 처리하는거에 대해 기록할예정.
먼저 Valid를 할 녀석을 찾아보자. 여기서 예로 드는 건, 통화 표시처럼, 3자리숫자, 3자리숫자.. 이렇게 입력되는거. (Pattern으로 해보았다.)
@Pattern( regexp = "^[0-9]+(,[0-9]+)*$", message = "내 Custom Message" )
private String MyString;
message는 선택사항. 안붙이면 자바가 알아서 붙여주는 메시지가 붙고, 만약 그게 싫어! 나만의 메시지를 전달할거야. 이렇게 생각하면 message를 붙일 것
1. Binding예외상황 발생 시 CustomException으로 처리 (BindingResult사용)
custom Exception을 만드는거.
public class MyException extends Exception{
//TBU
}
그리고 BindingResult의 결과에 따라 이렇게 던져주면 된다.
public myMethod(@Valid MyClass mc,
BindingResult bindingResult,
params..){
try{
if( bindingResult.hasError()){
StringBuilder builder = new StringBuilder();
List<ObjectError> errs = bindingResult.getAllErrors();
errs.forEach(item -> { builder.append(item.getDefaultMessage()); });
throw new MyException(builder.toString());
}
}
catch(MyException e){
//exception Handling
}
}
뭐 대략적으로 위에처럼..
2. Exception바로 던지기 (BindingResult가 없다면?)
BindingResult를 사용하지 않으면, 다른 어디에선가 Exception을 받아줘야한다.
import org.springframework.validation.BindException;
@ControllerAdvice
public MyExceptionHandler{
//@Valid에서 데이터 검증 실패호 Exception 발생하면. 아래 exception이 발생
//org.springframework.validation패키지에 있는 BindException으로 연결할것
//처음엔 네트워크쪽이 바인딩되서 걸리지 않았었음.
@ExceptionHandler(value = BindException.class)
public Result handleBindException(BindException e){
//error handling
}
//내가 Custom한 Exception일 처리하려면 class를 { }로 감싸줄것
@ExceptionHandler(value = { MyException.class})
public Result handleMyException{
}
}
//여기는 @Valid붙이는 부분
public void MyMethod(@Valid MyClass){
}
@Valid가 붙으면, 스프링 Bean에다가 "Bean, 너가 알아서 저 Object가 유효한지 검사해주세요." 라고 요청하는거다.
그래서 메소드가 호출되기 직전에 Validation을 수행하고, BindingResult가 없으면 알아서 BindException (org.springframework.validation.BindException)을 던져준다. 그럼 그걸 어디선가 핸들링 해야하는데, 그걸 위해
@ControllerAdvice를 붙인 녀석을 찾아 거기다가 던져준다. (이거는 스프링이 알아서..)
그럼 저기에서 발생되는 Exception에 맞는 ExceptionHandler를 전달해주면 된다.
댓글