본문 바로가기

카테고리 없음

[validation] @RequestParam으로 들어오는 파라미터의 exception handling / @RequestBody로 들어오는 객체의 exception handling

@RequestParam과 @RequestBody는 같은 어노테이션을 사용하지만, 신기하게도 exception이 다르게 발생한다.

주로 발생하는 exception을 정리하고, 어떻게 handling 할 지 알아보겠다.

 

@RequestParam

1. MissingServletRequestParameterException

필수적인 파라미터가 존재하지 않는 경우 해당 exception이 발생한다.

 

기본적으로 파라미터에 대해 required option이 true로 되어있기 때문에, RequestParam을 적용하고 파라미터를 넣어주지 않았다면 발생할 exception이다.

 

[ErrorCode]

INVALID_INPUT_VALUE(400, "COMMON-001", "유효성 검증에 실패한 경우")

 

2. MethodArgumentTypeMismatchException

필수적인 파라미터 값이 존재하지만, 전달받은 값이 파라미터의 타입이 아닐 때 발생한다.

 

조금 더 정확히 말하자면 전달받은 값은 사실 무조건 String이다.

이걸 컨트롤러의 파라미터 타입으로 변환 가능한 경우는 OK이고, 변환 불가능할 경우 해당 exception을 발생시킨다.

 

ex1: 쿼리 스트링에서 age="yoon" 으로 전달하고, Controller에서 @RequestParam int age로 받는다면, "yoon"이라는 string을 int로 변환할 수가 없기 때문에 exception이 발생한다

 

ex2: @DateTimeFormat(pattern="yyyy-MM-dd kk:mm:ss") 인데, 이와 일치하지 않는 String 값(예를 들어, 2022-10-10 11:11:1) 이 들어왔을때 parse가 되질 않는다. 이때, 해당 exception이 발생한다

 

[ErrorCode]

INVALID_INPUT_VALUE(400, "COMMON-001", "유효성 검증에 실패한 경우")

 

3. ConstraintViolationException

@Min, @Max, .. , @CustomValidAnnotation(내가 커스텀해서 만든

validation annotation을 말함) 과 같은 실제 validation annotation을 통과하지 못했을 때 발생하는 exception

 

@RequestBody에서는 MethodArgumentNotValidException로 발생하는데, 여기서는 ConstraintViolationException으로 발생하는 것이 다른 점이므로 주의할 것.

 

[ErrorCode]

INVALID_INPUT_VALUE(400, "COMMON-001", "유효성 검증에 실패한 경우")

 

 

RequestParam의 exception에 대한 ErrorCode는 INVALID_INPUT_VALUE로 작성하였다. 3가지 전부 다 파라미터 자체가 잘못 들어오거나 안들어온 것이므로, INVALID_INPUT_VALUE를 사용하였다.

 

@RequestBody

1. HttpMessageNotReadableException

JSON 형태 자체가 올바르지 못한 경우. 

 

예를 들어 JSON에서 마지막에 ,가 붙었다던지 해서 발생하는 오류

 

[ErrorCode]

INVALID_INPUT_JSON_VALUE(400, "COMMON-002", "올바르지 않은 JSON이 들어온 경우")

 

2. MethodArgumentNotValidException

@Min, @Max, .. , @CustomValidAnnotation(내가 커스텀해서 만든

validation annotation을 말함) 과 같은 실제 validation annotation을 통과하지 못했을 때 발생하는 exception

 

[ErrorCode]

INVALID_INPUT_VALUE(400, "COMMON-001", "유효성 검증에 실패한 경우")