JSON 파싱 오류가 났는데, GlobalExceptionHandler에서 JsonParseException이 아니라 ServerWebInputException으로 핸들링되고 있다. 왜 그런가?

JSON 파싱 오류가 났는데, GlobalExceptionHandler에서 JsonParseException이 아니라 ServerWebInputException으로 핸들링되고 있다.

왜 그런가?

 

Spring WebFlux에서는 JSON 바인딩 실패 시

ServerWebInputException 으로 감싸서 던진다.

동작 Spring MVC Spring WebFlux
JSON 파싱 실패 시 HttpMessageNotReadableException ServerWebInputException
내부 cause Jackson 예외 (JsonParseException, JsonMappingException) 동일
왜 다름? MVC: HttpMessageConverter 사용 WebFlux: HttpMessageReader 사용

 

예외 흐름 (WebFlux 기준)

  1. 클라이언트가 잘못된 JSON 전송
  2. Jackson에서 JsonParseException 또는 JsonMappingException 발생
  3. Jackson2JsonDecoder가 이 예외를 잡아
  4. 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인데 문자열 전달