티스토리 뷰
[ validation ] BindException? MethodArgumentNotValidException? (+ @RequestBody)
tbMaster 2022. 1. 4. 17:30spring boot validation을 적용하여 Exception 처리를 하고 있다. Exception 처리는 ControllerAdvice 를 이용하여 ExceptionHandler를 통해 공통적으로 작업하고 있는데, 평소와 같이 한 것 같은데 문제가 발생하였다.
문제
RestController에서 post 요청의 content를 자동으로 객체로 변한하도록 구현하였다. 그리고 변환받는 객체의 클래스에 있는 property에 validation 을 설정하였다.
그러나 단위테스트를 수행하는 중에 구현해놓은 ExceptionHandler에 진입하지 않고 계속해서 다른 에러를 뱉었다. BindException......음?
분명히... @Valid 에 대한 Excetion 클래스는 MethodArgumentNotValidException 이라고 했는데.... ?
해결
controller의 request 파라미터에서 @RequestBody를 붙여주면 된다.
원인
BindException : 해당 Exception의 경우, 타입캐스팅 과정에서 문제가 발생한 것이다. referenceType 이 Null 이기 때문에 바인딩 과정에서 에러가 발생한 것이다.
그러면 @RequestBody를 붙이니깐 BindException이 발생하지 않고 정상적으로 캐스팅이 된 이유는?
@RequestBody는 request의 content type을 확인하여 HttpMessageConverter를 통해 변환한다. 예를 들어 contentType이 application/json 이면 json에서 object 로 변환해준다. 그렇기 때문에 referenceType 이 Null값을 포함하더라고 캐스팅이 정상적으로 이뤄진다. 또한, @Valid를 이용하여 자동적으로 validation을 적용할 수 있게 한다. 그래서 원래 하고자 했던 Validation을 수행할 수 있게 되었고, 잘못된 요청으로 MethodArgumentNotValidException 이 발생하는 것을 확인할 수 있었다.
어이없는 실수였지만... 통상적으로 붙이던 @RequestBody에 대해서 확인해볼 수 있는 기회가 된 것 같아서 다행이라고 생각한다. ( 알고 쓰자... )
'Spring' 카테고리의 다른 글
[ Spring in Action ] HATEOAS 란? (0) | 2022.03.15 |
---|---|
[ 개념 ] DI ( Dependency Injection ) - 1 (0) | 2022.02.14 |
[ junit5 ] 단위테스트 - controller (0) | 2021.12.30 |
[Spring Rest Docs ] Spring Rest Docs 적용하기 (2) | 2021.11.23 |
[JPA] N:1 관계 (0) | 2021.11.22 |