기록의 공유

잊지않기 위한 기록의 공유

Backend/Spring

예외처리 유의점2

backend dev 2023. 2. 7. 16:17

1. @Valid,@Validated를 사용할때 주의점

@PostMapping
public String addReview(@Validated @RequestBody AddReviewReq addReviewReq, BindingResult bindingResult) {

    reviewService.addReview(addReviewReq);
    return "success";
}

만약 다음과 같이 BindingResult를 매개변수로 받기로 했다면 

스프링은 Bean Validation을 사용한 검증이 실패하더라도 BindingResult에 에러만 담아주고 메소드를 실행시켜준다.

즉 메소드안에서 에러에 대한 후처리를 해야만한다.

 

그게 아니고 @ControllerAdvice에서 예외에 대한 핸들러로 처리하고싶다면

BindingResult를 매개변수로 받지않게해서

MethodArgumentNotValidException

해당 예외가 발생하게해서 핸들러가 동작하게 해야한다.

 

@Valid,@Validated가 있는 메소드에서 BindingResult를 파라미터로 받지않으면 

필드에러,바인딩에러(매핑에러)가 발생했을때 예외가 발생한다.

2. handler 잘 사용하기

MethodArgumentNotValidException

를 처리해서 Bean Validation의 검증처리에 대한 예외 처리를 잘 해왔다.

 

MethodArgumentTypeMismatchException

를 처리해서 int인데 String이 들어오거나 하는 primitive 타입 변수들의 대한 예외처리를 해왔다.

 

그런데 만약 Long userId 에다가 "hi"라고 입력을 보내면

HttpMessageNotReadableException

 에러가 발생한다. 

JSON parse error: Cannot deserialize value of type `java.lang.Long` from String "hi": not a valid `java.lang.Long` value

@NotNull이라는 검증은 통과하였지만 , @ReuqestBody을 진행하던중 http메시지컨버터에서 json을 객체로 바꾸던중 오류가 발생한것이다.   Bean Validtion으로 해결하지못하고, 예외처리 핸들러를 이용했다.