• 배달 플랫폼을 구성하면서 회원 가입 + 로그인 기능을 구현을 하고 테스트를 진행다보니 Email 정보를 Email 형식에 맞추어 보내니 아래와 같은 예외가 발생한다.

    Untitled

  • org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Illegal unquoted character ((CTRL-CHAR, code 8)): has to be escaped using backslash to be included in string value

    • 에러를 살펴보면 HttpConverter 가 Json 을 객체로 변환하는 과정에서 문제가 생긴 거 같다. 얇은 영어로 대충 해석해보면 쌍따옴표가 없는 문자를 문자열로 인식 할려면 백슬래시 ( \ ) 가 포함해야 한다고 한다.
    • 아..그렇다 데이터를 보내는 과정에서 “” 가 누락이 되어 있었다. 시스템적인 문제가 아니라 단순 입력 오류에 대해서 Converter 가 Json 이 필드 값을 읽어오는 과정에서 데이터를 읽지 못해서 발생 하는 오류 였다.
  • 이슈를 해결하기 위해서 구글링을 해보면 Json 을 확인 또는 ObjectMapper 에 옵션을 추가하는 것으로 해결하는 방법이 있다고 한다.

  • ObjectMapper 의 옵션을 추가로 주라는 것도 있는데 옵션을 주게 되면 문제가 없을까?

    • objectMapper.configure(Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true)

      Untitled

    • ALLOW_UNQUOTED_CONTROL_CHARS 은 Deprecated → com.fasterxml.jackson.core.json.JsonReadFeature.ALLOW_UNESCAPED_CONTROL_CHARS 을 사용하자.

      Untitled

  • Json 이 Java 객체로 변환되는 과정을 한번 살펴보자.

    • Http 요청 → DispatcherServlet → HandlerMapping → HandlerAdapter → Controller
    • HandlerAdapter → Controller 이 과정 사이에서 ArgumentResolver 에 의해서 Body 의 내용들이 필요에 의해서 변환이 처리가 됩니다.
    • ArgumentResolver 안에서 Converter 을 불러와서 변환 처리가 되며, Json 의 경우 AbstractJackson2HttpMessageConverter 를 이용해 변환을 처리 합니다.
      • Converter 의 readJavaType 를 통해서 데이터를 읽어오는 과정에서 문제가 발생하여 예외가 발생하는 것입니다.

        Untitled

      • 더 들어가보면 요청의 Body 내용을 역직렬화를 거쳐서 객체로 변환 하는 과정을 볼 수 있습니다.

        Untitled

      • 객체로 변환 하는 과정에서 String 문자열의 끝을 찾는 com.fasterxml.jackson.core.json.UTF8StreamJsonParser._finishString2 에서 문제가 발생하게 됩니다.

        Untitled

        Untitled

      • 결과적으로 끝을 찾지 못하여 com.fasterxml.jackson.core.base.ParserBase._throwUnquotedSpace 가 발생하고 이는 Console 에 응답 받은 예외의 내용이 들어 있습니다.

        Untitled

      • 여기서 보면 위에서 문제 해결 방법으로 제시 했던 objectMapper.configure(Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true) 설정의 값을 통해서 예외를 발생 여부를 컨트롤 할 수 있습니다.

  • 결론적으로, 이러한 문제가 발생한 것은 파서가 JSON 문자열에 따옴표가 없는 제어 문자(탭 및 줄 바꿈 문자를 포함하여 값이 32보다 작은 ASCII 문자)를 포함하는냐의 여부에 따라 예외가 발생합니다. JSON 사양에서는 모든 제어 문자에 따옴표가 필요하므로 이는 비표준 기능이므로 기본적으로 비활성화되어 있습니다.

  • 즉, 사용자의 실수가 대부분이라는 것이며 이러한 실수는 표시하여 입력이 잘 못 되었다고 표시를 해주는 것이 좋다고 생각이 든다.