RequestBody에 대해서 Validation이 실패했을 때 custom한 error를 떨어트리는 것을 하였습니다. 그런데, 쿼리 파라미터라던지, path variable에 대해서 Validation을 처리하지는 못합니다. 이것을 처리하기 위해서는 ConstrainViolationException을 컨트롤러 advice에서 처리해 주어야 합니다.

 


 ContraintViolationException이 떨어졌을 때, custom message를 어떻게 떨굴지 보도록 하겠습니다.

 

 먼저, e에 contraintViolations가 있습니다. HashSet이 있는데요. 이 안에 ConstraintViolationImple가 들어가 있음을 볼 수 있어요. HashSet 내부에 있는 키들을 모두 순회해서 값들을 가져와야 함을 알 수 있어요. 원소들에 어떤 내용들이 저장되어 있는지 보겠습니다.

 

 

 interpolatedMessage가 있네요. "1 이상이여야 합니다" 라는 메세지가 있는데요. 이는 1 이상이여야 하는데, 실제로는 0이 들어와서 validation에 걸렸기 때문입니다. 다음에 propertyPath에는 getUser02.peopleId가 있는데요. 이것이 제약 조건을 위반한 필드입니다. 그러니, hashSet에 있는 key들을 모두 돌면서 message와  propertyPath를 가져 오면 됩니다.

 

 

 ConstraintViolationException이 떨어졌을 때에는, pathBad가 호출되게 됩니다. 이 메서드를 보면, ConstraintViolations를 얻어와서, 이 안에 있는 Key인 ConstraintViolation을 모두 탐색합니다. 그리고 이들에 대해서 propertyPath와 Message를 가져와서, 리스트에 모두 넣은 다음에, ResponseEntity의 body에 담아서 리턴해 버리게 됩니다.

 


 testController를 보겠습니다. 여기에 Validated 어노테이션을 추가합니다. 그리고 테스트를 위한 api를 간단하게 작성하겠습니다.

 

 

 먼저 /people/{peopleId}/{itemId}입니다. pathVariable의 값이 1 이상인지 테스트 하게 됩니다.

 

 

 다음에, query string으로 들어오는 것들에 대해서도 테스트 해 보겠습니다. 이것들 역시 들어오게 된다면 1 이상이여야 합니다.

 

 

 postman으로 날려보겠습니다. peopleId와 itemId의 value값이 모두 0인데요. 1 이하이므로 실패할 겁니다.

 

 

 실패하네요. message에는 1 이상이여야 한다고 나옵니다.

 

 

 이번에는 path variable에 대해서도 테스트를 해 봅시다. 앞에 peopleId는 0이고 itemId는 1입니다. 역시 실패해야 정상입니다. 왜냐하면, peopleId가 1보다 크거나 같지 않기 때문입니다.

 

 

 validation에 실패해서 peopleId가 1 이상이여야 한다는 에러 정보가 떨어졌음을 알 수 있습니다.