[맛침반] 트러블 슈팅 - BindException과 공통 에러 처리

6720·2024년 3월 2일

프로젝트 맛침반

목록 보기
9/12

현재 상황

매장 등록 기능을 만드는 도중 모든 객체(매장 정보, 매장 이미지 정보, 메뉴 정보)를 넣지 않고 api를 요청했는데 다음과 같이 응답됐다.

{
	"code": 00000,
	"msg": "검증 오류",
	"result": [
		~~
		~~
		~~
	]
}

원래 같더라면 다음처럼 result에 어디가 문제인지 출력돼야 하지만 그러지 않았다.

로그 상으로는 에러 메시지가 남는 것을 보면 어디가 잘못된 것같다.

상황 파악

실험 1: 에러가 복수라서 발생하는 문제인가?

현재 에러는 셋 다 @NotNull에서 발생하고 있다. 그렇다면 두 개의 @NotNull을 제외했을 때는 제대로 출력이 될까?

에러는 제대로 한 번 발생하지만 응답에서는 제대로 체크를 못하고 있다.

-> 에러의 수 때문에 발생하는 문제는 아니다.

실험 2: 잘못된 어노테이션을 사용했는가?

@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로 변경하여 실험해봤다.

어노테이션을 변경했음에도 불구하고 에러는 동일하게 발생했다.

-> 어노테이션 탓은 아니다.

실험 3 : BindException을 처리하는 메서드가 없어서 그런가?

공통 에러 처리 기능에서 검증을 감지하는 예외는 MethodArgumentNotValidException로 되어 있다. 그렇다면 단순하게 BindException를 처리하지 않아서 그런건 아닐까?

@ExceptionHandler  
public ResponseEntity<Object> bindExceptionHandler(BindException e) {  
    return new ResponseEntity<>(new ResultData(e.getBindingResult()), HttpStatus.BAD_REQUEST);  
}

다음과 같은 에러 처리 메서드를 생성하여 GlobalExceptionHandler에 추가했다.

제대로 작동하는 모습이다.

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

참고 자료

profile
뭐라도 하자

0개의 댓글