티스토리 뷰

반응형

spring 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
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함