코드스쿼드 20주차 -3

박동규·2022년 6월 1일
0

BindException vs MethodArgumentNotValidException

유효성 검사를 위해, @Valid 어노테이션을 달고, DTO 객체에 @NotNull 처리를 해주고 @ControllerAdvice 처리를 통해 예외 처리를 받아주려 하였는데, MethodArgumentNotValidException 예외가 발생하지 않고, BindException 가 발생하는 문제가 있었다.

이는, @ModelAttribute 어노테이션으로 매핑하게 되면 파라미터값의 타입 캐스팅 과정에서 BindException 을 발생시키면 되기 때문이다.

@RequestBody 의 경우, HttpMessageConverter 가 동작하며 요청 본문을 변환하고 유효성을 검사하는 작업을 하기 때문에, HttpMessageConverter 의 메서드에 들어가는 인자가 잘못 되었다는 MethodArgumentNotValidexception 를 발생시키는 것이다.

BindException : 해당 Exception의 경우, 타입캐스팅 과정에서 문제가 발생한 것이다. referenceType 이 Null 이기 때문에 바인딩 과정에서 에러가 발생한 것이다.

  • @RequestBody는 왜 BindException이 발생하지 않을까?

@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

@Valid 와 @ControllerAdvice로 DTO 예외처리 하기

출처 : https://cchoimin.tistory.com/entry/Valid-%EC%99%80-ControllerAdvice%EB%A1%9C-DTO-%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%AC%ED%95%98%EA%B8%B0

@Valid vs @Validated

https://mangkyu.tistory.com/174

유효성 검사 어노테이션 종류

출처 : https://dev-coco.tistory.com/123

0개의 댓글