유효성 검사를 위해, @Valid 어노테이션을 달고, DTO 객체에 @NotNull 처리를 해주고 @ControllerAdvice 처리를 통해 예외 처리를 받아주려 하였는데, MethodArgumentNotValidException 예외가 발생하지 않고, BindException 가 발생하는 문제가 있었다.
이는, @ModelAttribute 어노테이션으로 매핑하게 되면 파라미터값의 타입 캐스팅 과정에서 BindException 을 발생시키면 되기 때문이다.
@RequestBody 의 경우, HttpMessageConverter 가 동작하며 요청 본문을 변환하고 유효성을 검사하는 작업을 하기 때문에, HttpMessageConverter 의 메서드에 들어가는 인자가 잘못 되었다는 MethodArgumentNotValidexception 를 발생시키는 것이다.
BindException : 해당 Exception의 경우, 타입캐스팅 과정에서 문제가 발생한 것이다. referenceType 이 Null 이기 때문에 바인딩 과정에서 에러가 발생한 것이다.
@RequestBody는 request의 contentType을 확인하여 HttpMessageConverter를 통해 변환한다.
예를 들어 contentType이 application/json 이면 json에서 object 로 변환해준다. 그렇기 때문에 referenceType 이 Null값을 포함 하더라도 캐스팅이 정상적으로 이뤄진다. 캐스팅 작업은 문제가 없이 끝났으니, 이제 @Valid로 적용 된 제약 조건을 확인하여 적용하게 되는 것이다. 제약조건들을 확인하고, 값이 잘못 되었다면 메서드 파라미터값이 잘못 되었다는 의미인 MethodArgumentNotValidException 이 발생하는 것이다.
(참조: https://github.com/spring-projects/spring-framework/issues/14790)
참조 :
https://velog.io/@park2348190/Spring%EC%9D%98-Validation
https://github.com/spring-projects/spring-framework/issues/14790
https://tbmaster.tistory.com/109
https://syoun602.tistory.com/16
https://mangkyu.tistory.com/174
출처 : https://dev-coco.tistory.com/123