[작업로그] ObjectMapper로 String to Object 는 불가하다

AUGUST 24, 2021

이번에 RestTemplate 세팅을 하면서 req/res 로깅을 하도록 구성을 했다.
req/res 의 경우 당연히 Object(Null 포함)라 생각했기 때문에 ObjectMapper 클래스의 readValue 메소드를 이용하여
map 객체로 변환하였다.

테스트에서는 별 문제 없이 잘 작동하는 듯 하였으나…
응답값이 Json 포맷의 문자열이 아닐 경우 즉, 일반 문자열 일 경우, 오브젝트로 변환 시 아래와 같은 오류가 발생하였다.

com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'hello': was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false')
 at [Source: (byte[])"hello world"; line: 1, column: 7]

그래서 아래와 같이 테스트를 진행해봤다.

case1) readValue 메소드를 이용하여 string to object

val stringData = "hello world"
try {
    objectMapper.readValue(stringData.toByteArray(), String::class.java)
    println("success 1")
} catch (e: Exception) {
    println("error1 [stringData] : " + e.message) //에러 발생!!!
}

1번 케이스의 경우 에러가 발생했다.
readValue 메소드 내의 코드를 보니 JsonParser를 생성하는걸로 봐선 Json 포맷만 가능한걸로 보인다.


case2) writeValueAsString 메소드를 이용하여 object to string

val stringData = "hello world"

try {
    objectMapper.writeValueAsString(stringData)
    println("success 2") //성공!!!
} catch (e: Exception) {
    println("error2 [stringData] : " + e.message)
}

2번 케이스의 경우는 에러가 발생하지 않았다.
writeValueAsString 메소드에서는 param으로 받은 object를 serialize 하여 이를 문자열로 반환하기 때문에 정상적으로 작동한 것으로 보인다.


결론적으로,
req의 경우에는 모두 DTO 클래스로 정의를 했기 때문에 readValue 메소드를 이용하여 map 객체로 변환하였고,
res의 경우에는 DTO 클래스 또는 string 객체로 정의 했기 때문에

String(it, StandardCharsets.UTF_8)

을 이용하여 String 객체로 로깅하였다.

그런데 생각해보니.. ES를 이용하여 로깅수집을 하고 있기 때문에 type 검사 후에 string 또는 map 으로 변환하는게 가장 좋을 듯 싶다.
추후에 다시 수정해야겠다.


작업 기록 블로그