
매장 등록 기능을 만드는 도중 모든 객체(매장 정보, 매장 이미지 정보, 메뉴 정보)를 넣지 않고 api를 요청했는데 다음과 같이 응답됐다.
{
"code": 00000,
"msg": "검증 오류",
"result": [
~~
~~
~~
]
}
원래 같더라면 다음처럼 result에 어디가 문제인지 출력돼야 하지만 그러지 않았다.

로그 상으로는 에러 메시지가 남는 것을 보면 어디가 잘못된 것같다.
현재 에러는 셋 다 @NotNull에서 발생하고 있다. 그렇다면 두 개의 @NotNull을 제외했을 때는 제대로 출력이 될까?


에러는 제대로 한 번 발생하지만 응답에서는 제대로 체크를 못하고 있다.
-> 에러의 수 때문에 발생하는 문제는 아니다.
@PostMapping("")
public ResponseEntity<Object> registerRestaurant(
@ModelAttribute @Valid RestaurantRegisterRequest request,
@AuthenticationPrincipal CustomUserDetails userDetails
) {
restaurantService.registerRestaurant(request, userDetails);
return new ResponseEntity<>(new ResultData(), HttpStatus.CREATED);
}
현재 컨트롤러에는 다음처럼 @Valid로 검증을 받고 있다.
공통 에러 처리 기능을 맡으신 팀원분의 보고서에는 @Validated를 사용했다.
그렇다면 어노테이션의 문제일까? @Valid를 @Validated로 변경하여 실험해봤다.

어노테이션을 변경했음에도 불구하고 에러는 동일하게 발생했다.
-> 어노테이션 탓은 아니다.
공통 에러 처리 기능에서 검증을 감지하는 예외는 MethodArgumentNotValidException로 되어 있다. 그렇다면 단순하게 BindException를 처리하지 않아서 그런건 아닐까?
@ExceptionHandler
public ResponseEntity<Object> bindExceptionHandler(BindException e) {
return new ResponseEntity<>(new ResultData(e.getBindingResult()), HttpStatus.BAD_REQUEST);
}
다음과 같은 에러 처리 메서드를 생성하여 GlobalExceptionHandler에 추가했다.

제대로 작동하는 모습이다.
평소에 검증 과정에서 발생하는 MethodArgumentNotValidException와는 달리 다른 예외가 발생하여 당황했는데 이럴 때는 당연하게도 그 예외에 대한 처리를 해주면 된다.