JSON 파싱 오류가 났는데, GlobalExceptionHandler에서 JsonParseException이 아니라 ServerWebInputException으로 핸들링되고 있다.
왜 그런가?
Spring WebFlux에서는 JSON 바인딩 실패 시
ServerWebInputException 으로 감싸서 던진다.
| 동작 | Spring MVC | Spring WebFlux |
| JSON 파싱 실패 시 | HttpMessageNotReadableException | ServerWebInputException |
| 내부 cause | Jackson 예외 (JsonParseException, JsonMappingException) | 동일 |
| 왜 다름? | MVC: HttpMessageConverter 사용 | WebFlux: HttpMessageReader 사용 |
예외 흐름 (WebFlux 기준)
- 클라이언트가 잘못된 JSON 전송
- Jackson에서 JsonParseException 또는 JsonMappingException 발생
- Jackson2JsonDecoder가 이 예외를 잡아
- ServerWebInputException 으로 감싸서 던짐
→ 즉, Spring WebFlux는 @RequestBody 바인딩 실패를 모두 ServerWebInputException으로 감싼다.
✅ 왜 그럼 GlobalExceptionHandler에서 JsonParseException이 안 잡히는가?
@ExceptionHandler(JsonParseException::class)
fun handleParse(e: JsonParseException): ... // ❌ 호출되지 않음
@ExceptionHandler(HttpMessageNotReadableException::class)
fun handleReadError(e: HttpMessageNotReadableException): ... // ✅ 여기서 잡힘
이유: JsonParseException은 내부 cause로만 존재하기 때문
Spring은 기본적으로 “던져진 예외 타입”으로만 핸들러를 매칭함
✅ 해결 방법 1: HttpMessageNotReadableException 핸들러에서 내부 cause 분기
@ExceptionHandler(HttpMessageNotReadableException::class)
fun handleReadableError(e: HttpMessageNotReadableException): ResponseEntity<*> {
return when (val cause = e.cause) {
is JsonParseException -> {
// 구문 오류 (JSON 깨짐)
ResponseEntity.badRequest().body("잘못된 JSON 문법입니다.")
}
is JsonMappingException -> {
// 구조 오류 (필드 타입 안 맞음 등)
ResponseEntity.badRequest().body("JSON 필드 매핑 오류입니다.")
}
else -> {
// 기타 읽기 오류
ResponseEntity.badRequest().body("요청 본문을 읽을 수 없습니다.")
}
}
}
| 예외명 | 소속 | 발생 위치 | 원인 | 특징 |
| JsonParseException | Jackson (com.fasterxml.jackson.core) | JSON 파싱 초기 단계 | JSON 문법 오류 (예: 중괄호 닫힘 누락, 콤마 빠짐 등) | Jackson 내부에서 던짐 |
| JsonMappingException | Jackson (com.fasterxml.jackson.databind) | JSON 파싱 중 매핑 단계 | JSON 구조는 맞지만, 필드 타입 불일치나 존재하지 않는 필드 등 | 상위 개념으로 JsonParseException을 포함할 수도 있음 |
| HttpMessageNotReadableException | Spring (org.springframework.http.converter) | Spring이 Jackson 예외를 감쌈 | Jackson 예외(JsonParseException, JsonMappingException) 등 | 클라이언트 요청 본문을 읽고 객체로 변환할 수 없을 때 전반적으로 발생함 |
JsonParseException
{ "name": "jennie" "age": 20 } // ← 콤마 빠짐
JsonMappingException
{ "name": "Jiye", "age": "twenty" } // ← age는 Int인데 문자열 전달
