본문 바로가기
Programming/Java_Spring

@Valid시 Data Validation시 예외처리 남기기

by 곰네Zip 2022. 8. 19.

@Valid 애노테이션을 사용하면, 전달받는 객체에 대해 검증을 처리할 수 있다. 

그리고 BindingResult를 통해서 처리하든, 아니면 바로 BindException을 발생시켜버리든 가능하다.

근데, Exception이 발생한 이후에도 적절한 예외처리를 하거나,

아니면 예외 발생 시, 그에 맞는 메시지를 띄우고싶다면?

 

그 전에.. @Valid애노테이션을 통해 데이터 검증을 해주는 방법은 아래 포스팅 참고

https://gomnezip.tistory.com/399

 

@Valid와 @ControllerAdvice 애노테이션

@Valid애노테이션을 사용하여 전달되는 값의 validation을 수행할 수 있다. 만약 메소드에서 전달받은 이후에 무언가 처리를 하고싶다면 BindingResult를 쓰면 되지만 그냥 Exception이 발생시키도록 했다

gomnezip.tistory.com

여기서는 예외상황별로 메시지를 만드는 것과, 그 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를 전달해주면 된다.

반응형

댓글