배달 플랫폼을 구성하면서 회원 가입 + 로그인 기능을 구현을 하고 테스트를 진행다보니 Email 정보를 Email 형식에 맞추어 보내니 아래와 같은 예외가 발생한다.
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
이슈를 해결하기 위해서 구글링을 해보면 Json 을 확인 또는 ObjectMapper 에 옵션을 추가하는 것으로 해결하는 방법이 있다고 한다.
ObjectMapper 의 옵션을 추가로 주라는 것도 있는데 옵션을 주게 되면 문제가 없을까?
objectMapper.configure(Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true)
ALLOW_UNQUOTED_CONTROL_CHARS 은 Deprecated → com.fasterxml.jackson.core.json.JsonReadFeature.ALLOW_UNESCAPED_CONTROL_CHARS 을 사용하자.
Json 이 Java 객체로 변환되는 과정을 한번 살펴보자.
AbstractJackson2HttpMessageConverter
를 이용해 변환을 처리 합니다.
Converter 의 readJavaType
를 통해서 데이터를 읽어오는 과정에서 문제가 발생하여 예외가 발생하는 것입니다.
더 들어가보면 요청의 Body 내용을 역직렬화를 거쳐서 객체로 변환 하는 과정을 볼 수 있습니다.
객체로 변환 하는 과정에서 String 문자열의 끝을 찾는 com.fasterxml.jackson.core.json.UTF8StreamJsonParser._finishString2
에서 문제가 발생하게 됩니다.
결과적으로 끝을 찾지 못하여 com.fasterxml.jackson.core.base.ParserBase._throwUnquotedSpace
가 발생하고 이는 Console 에 응답 받은 예외의 내용이 들어 있습니다.
여기서 보면 위에서 문제 해결 방법으로 제시 했던 objectMapper.configure(Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true) 설정의 값을 통해서 예외를 발생 여부를 컨트롤 할 수 있습니다.
결론적으로, 이러한 문제가 발생한 것은 파서가 JSON 문자열에 따옴표가 없는 제어 문자(탭 및 줄 바꿈 문자를 포함하여 값이 32보다 작은 ASCII 문자)를 포함하는냐의 여부에 따라 예외가 발생합니다. JSON 사양에서는 모든 제어 문자에 따옴표가 필요하므로 이는 비표준 기능이므로 기본적으로 비활성화되어 있습니다.
즉, 사용자의 실수가 대부분이라는 것이며 이러한 실수는 표시하여 입력이 잘 못 되었다고 표시를 해주는 것이 좋다고 생각이 든다.